1C
August 12
Всякие полезности
Текстовый файл
Как выгрузить данные из справочника в текстовый файл?
Текст = Новый ТекстовыйДокумент; Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл Стр = СтрЗаменить(Выборка.Наименование, Символ(34), "%квч%"); Код = Строка(Выборка.Код) + Символ(34); Текст.ДобавитьСтроку(Код + Стр); КонецЦикла; Текст.Записать("c:\temp\text.txt");
Как загрузить данные из текстового файла?
Текст = Новый ТекстовыйДокумент; Текст.Прочитать("c:\temp\text.txt"); Для НомерСтроки = 1 По Текст.КоличествоСтрок() Цикл Стр = Текст.ПолучитьСтроку(НомерСтроки); Позиция = Найти(Стр, Символ(34)); Код = Сред(Стр, 1, Позиция-1); прНаименование = Сред(Стр, Позиция + 1); Наименование = СтрЗаменить(прНаименование, "%квч%", Символ(34)); Сообщить(Код + "-" + Наименование); КонецЦикла;
Работа с текстом. Модель последовательного доступа
Путь = "c:\temp\text.txt"; Текст = Новый ЗаписьТекста(Путь, КодировкаТекста.UTF8); Выборка = Справочники.Номенклатура.Выбрать(); Пока Выборка.Следующий() Цикл Текст.ЗаписатьСтроку(Выборка.Наименование); КонецЦикла; Текст.Закрыть();
Путь = "c:\temp\text.txt"; Текст = Новый ЧтениеТекста(Путь, КодировкаТекста.UTF8); Стр = Текст.ПрочитатьСтроку(); Пока Стр <> Неопределено Цикл Стр = Текст.ПрочитатьСтроку(); Сообщить(Стр); КонецЦикла;
XML
Как из одной базы перенести документ в другую базу?
// Выгрузить в файл xml. ЗаписьXML=Новый ЗаписьXML(); ЗаписьXML.ОткрытьФайл("c:\doc.xml"); ЗаписьXML.ЗаписатьНачалоЭлемента("Root"); // Получить объект по ссылке. ВыгружаемыйОбъект=Документ.ПолучитьОбъект(); // С помощью средств сериализации записать объект в файл. ЗаписатьXML(ЗаписьXML,ВыгружаемыйОбъект); ЗаписьXML.ЗаписатьКонецЭлемента(); ЗаписьXML.Закрыть();
ЧтениеXML=Новый ЧтениеXML(); ЧтениеXML.ОткрытьФайл("c:\doc.xml"); // Текущим становится элемент Root. ЧтениеXML.Прочитать(); // Текущим становится элемент с документом. ЧтениеXML.Прочитать(); // Проверить сможет ли с данным значением "справиться" // система сериализации в данной базе. Если ВозможностьЧтенияXML(ЧтениеXML) Тогда // Получить ДокументОбъект.РеализацияТоваровУслуг ЗагружаемыйОбъект=ПрочитатьXML(ЧтениеXML); ЗагружаемыйОбъект.Записать(); КонецЕсли; ЧтениеXML.Закрыть();
Как можно сформировать XML-документ произвольной структуры?
Запись = Новый ЗаписьXML; Запись.ОткрытьФайл(ПутьКФайлу); Запись.ЗаписатьОбъявлениеXML(); Запись.ЗаписатьНачалоЭлемента("Корневой"); Запись.ЗаписатьАтрибут("Справочник", "Номенклатура"); Запись.ЗаписатьКомментарий("Краткая информация о номенклатуре"); Выборка = Справочники.Номенклатура.ВыбратьИерархически(); Пока Выборка.Следующий() Цикл Если Выборка.ЭтоГруппа Тогда Продолжить; КонецЕсли; Запись.ЗаписатьНачалоЭлемента("Элемент"); Запись.ЗаписатьАтрибут("Код", Строка(Выборка.Код)); Запись.ЗаписатьАтрибут("Артикул", Строка(Выборка.Артикул)); Запись.ЗаписатьТекст(Выборка.Наименование); Запись.ЗаписатьКонецЭлемента(); КонецЦикла; Запись.ЗаписатьКонецЭлемента(); Запись.Закрыть();
Как сформировать XML-документ в строку?
Запись = Новый ЗаписьXML(); Запись.УстановитьСтроку(); Запись.ЗаписатьОбъявлениеXML(); Запись.ЗаписатьНачалоЭлемента("Корневой"); Запись.ЗаписатьАтрибут("Справочник", "Номенклатура"); Запись.ЗаписатьКомментарий("Краткая информация о номенклатуре"); Выборка = Справочники.Номенклатура.ВыбратьИерархически(); Пока Выборка.Следующий() Цикл Если Выборка.ЭтоГруппа Тогда Продолжить; КонецЕсли; Запись.ЗаписатьНачалоЭлемента("Элемент"); Запись.ЗаписатьАтрибут("Код", Строка(Выборка.Код)); Запись.ЗаписатьАтрибут("Артикул", Строка(Выборка.Артикул)); Запись.ЗаписатьТекст(Выборка.Наименование); Запись.ЗаписатьКонецЭлемента(); КонецЦикла; Запись.ЗаписатьКонецЭлемента(); Стр = Запись.Закрыть(); Сообщить(Стр);
Как можно обмениваться данными, используя XML-сериализацию через файлы других форматов?
ЗаписьXML = Новый ЗаписьXML(); ЗаписьXML.УстановитьСтроку(); Данные = СсылкаНаДокумент.ПолучитьОбъект(); ЗаписатьXML(ЗаписьXML, Данные); ТекстСообщения = ЗаписьXML.Закрыть(); Текст = Новый ТекстовыйДокумент; Текст.УстановитьТекст(ТекстСообщения); Текст.Записать(ПутьКФайлу);
Текст = Новый ТекстовыйДокумент; Текст.Прочитать(ПутьКФайлу); ЧтениеXML = Новый ЧтениеXML(); ЧтениеXML.УстановитьСтроку(Текст.ПолучитьТекст()); Если ВозможностьЧтенияXML(ЧтениеXML) Тогда Данные = ПрочитатьXML(ЧтениеXML); Данные.Записать(); КонецЕсли;
Как можно загрузить XML документ произвольной структуры?
Чтение = Новый ЧтениеXML; Чтение.ОткрытьФайл(ПутьКФайлу); Пока Чтение.Прочитать() Цикл // Прочитать "структурные части" элементов. // Проверить, какая часть элемента - текущая. Если Чтение.ТипУзла = ТипУзлаXML.НачалоЭлемента Тогда ИмяУзла = Чтение.Имя; Сообщить("--" + ИмяУзла); // Атрибуты элементов можно читать только если текущая часть - // начало элемента Пока Чтение.ПрочитатьАтрибут() Цикл // Прочитать данные узла атрибута. ТипУзла = Чтение.ТипУзла; Имя = Чтение.Имя; Значение = Чтение.Значение; // Обработать полученные значения. КонецЦикла; ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.Текст Тогда // В примере просто выводим текст в окно сообщений. Сообщить("Текст:" + Чтение.Значение); ИначеЕсли Чтение.ТипУзла = ТипУзлаXML.КонецЭлемента Тогда // В примере просто выводим признак конца элемента // в окно сообщений Сообщить("--Конец:" + Чтение.Имя); КонецЕсли; КонецЦикла;
DBF-файлы
Как можно построить выгрузку-загрузку посредством файлов DBF?
БД = Новый XBase; БД.Поля.Добавить("CODE", "S", 5); БД.Поля.Добавить("NAME", "S", 40); БД.СоздатьФайл(Путь + "start.dbf", Путь + "index.cdx"); БД.Индексы.Добавить("IDXCODE", "CODE"); ФлИБД = БД.СоздатьИндексныйФайл(Путь + "index.cdx"); БД.АвтоСохранение = Истина; Выборка = Справочники.Номенклатура.ВыбратьИерархически(); Пока Выборка.Следующий() Цикл БД.Добавить(); БД.CODE = Выборка.Код; БД.NAME = Выборка.Наименование; КонецЦикла; БД.ЗакрытьФайл();
БД = Новый XBase; БД.ОткрытьФайл(Путь + "start.dbf", Путь + "index.cdx"); БД.ТекущийИндекс = БД.Индексы.IDXCODE; Пока БД.Следующая() Цикл Сообщить(БД.CODE); Сообщить(БД.NAME); КонецЦикла; БД.ЗакрытьФайл();
Работа с HTML-документами
Заполнение HTML-анкет
Процедура URLПриИзменении(Элемент) ЭлементыФормы.ПолеHTML.Перейти(URL); КонецПроцедуры
Процедура ПолеHTMLДокументСформирован(Элемент) // Событие возникает и при открытии формы, когда в реквизите // URL содержится пустая строка. Если URL <> "" Тогда Док = ЭлементыФормы.ПолеHTML.Документ; // При попытке обратиться к несуществующему свойству // произойдет ошибка Док.forms["frm"].fam.Value = "Иванов"; Док.forms["frm"].nam.Value = "Иван"; Док.forms["frm"].otch.Value = "Иванович"; КонецЕсли; КонецПроцедуры
Работа с файлами
Как организовать диалог выбора текстового файла?
Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытияФайла.ПолноеИмяФайла = ""; Фильтр = "Текст(*,txt)|*.txt"; ДиалогОткрытияФайла.Фильтр = Фильтр; ДиалогОткрытияФайла.МножественныйВыбор = Ложь; ДиалогОткрытияФайла.Заголовок = "Выберите файл"; Если ДиалогОткрытияФайла.Выбрать() Тогда ПутьКФайлу = ДиалогОткрытияФайла.ПолноеИмяФайла; КонецЕсли;
Режим = РежимДиалогаВыбораФайла.ВыборКаталога; ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим); ДиалогОткрытия.Каталог = ""; ДиалогОткрытия.МножественныйВыбор = Ложь; ДиалогОткрытия.Заголовок = "Выберите каталог"; Если ДиалогОткрытия.Выбрать() Тогда ПутьККаталогу = ДиалогОткрытия.Каталог; КонецЕсли;
Как прочитать информацию о файле?
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогОткрытияФайла.Выбрать(); Файл = Новый Файл(ДиалогОткрытияФайла.ПолноеИмяФайла); Текст = "Файл: " + Файл.Имя; Текст = Текст + Символы.ПС + "Расширение: " + Файл.Расширение; Текст = Текст + Символы.ПС + "Полное имя: " + Файл.ПолноеИмя; Текст = Текст + Символы.ПС + "Путь: " + Файл.Путь; Текст = Текст + Символы.ПС + "Размер: " + Файл.Размер() + " байт"; Текст = Текст + ?(Файл.ПолучитьНевидимость(), Символы.ПС + "Невидимый. ", ""); Текст = Текст + ?(Файл.ПолучитьТолькоЧтение(), Символы.ПС + "Только чтение.", ""); Текст = Текст + Символы.ПС + "Последнее изменение: " + Файл.ПолучитьВремяИзменения(); Сообщить(Текст);
Как получить список файлов в указанном каталоге?
МассивНайденных = НайтиФайлы("C:\Обмен\Входящие", "*.xml"); Для Каждого Файл из МассивНайденных Цикл Сообщить(Файл.Имя); // Обработать найденные файлы. КонецЦикла;
Как переместить файл, выложенный на ftp к себе на локальный компьютер?
Если НайтиФайлы("C:\Temp\Sklad.xml") <> Неопределено Тогда УдалитьФайлы("C:\Temp\ Sklad.xml "); КонецЕсли; Если НайтиФайлы("ftp://111.222.333.4/Sklad.xml") <> Неопределено Тогда ПереместитьФайл("ftp://111.222.333.4/Sklad.xml", "C:\Temp\ Sklad.xml"); Сообщить("Файл перемещен."); Иначе Сообщить("Действие не выполнено. Файл в источнике не найден."); КонецЕсли;
Как разделить большой файл на несколько файлов определенного размера?
РазделитьФайл("D:/1/MyFile.xml", 1024*1024, "D:/1/11/"); ОбъединитьФайлы("D:/1/11/MyFile.xml.*", "D:/1/11/MyProg.exe");
Как поместить файлы в архив?
ФайлАрхива = Новый ЗаписьZipФайла("C:\Arch.zip", , , МетодСжатияZIP.Сжатие, УровеньСжатияZIP.Максимальный); ФайлАрхива.Добавить("C:\Inetpub\wwwroot\Applic1\*.*", РежимСохраненияПутейZIP.СохранятьОтносительныеПути, РежимОбработкиПодкаталоговZIP.ОбрабатыватьРекурсивно); ФайлАрхива.Записать();
ФайлАрхива = Новый ЧтениеZIPФайла("C:\Arch.zip"); ФайлАрхива.ИзвлечьВсе("C:\Open", РежимВосстановленияПутейФайловZIP.Восстанавливать); ФайлАрхива.Закрыть();
Как сравнить два текстовых файла?
ДиалогОткрытияФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогОткрытияФайла.Фильтр = "Текстовый документ(*.txt)|*.txt"; // Выбрать первый файл. ДиалогОткрытияФайла.Заголовок = "Выберите первый файл:"; ДиалогОткрытияФайла.Выбрать(); ИмяФайла1 = ДиалогОткрытияФайла.ПолноеИмяФайла; // Выбрать второй файл. ДиалогОткрытияФайла.Заголовок = "Выберите второй файл:"; ДиалогОткрытияФайла.Выбрать(); ИмяФайла2 = ДиалогОткрытияФайла.ПолноеИмяФайла; // Сравнить выбранные файлы. СравнениеФайлов = Новый СравнениеФайлов(); СравнениеФайлов.ПервыйФайл = ИмяФайла1; СравнениеФайлов.ВторойФайл = ИмяФайла2; СравнениеФайлов.ИгнорироватьПустоеПространство = Истина; СравнениеФайлов.СпособСравнения = СпособСравненияФайлов.ТекстовыйДокумент; СравнениеФайлов.ПоказатьРазличия();
Как организовать контроль формирования файла внешним приложением?
Процедура ПроверкаНаличияФайла() ИмяКаталога = "c:\temp"; Маска = "*.xml"; НайденныеФайлы = НайтиФайлы(ИмяКаталога, Маска); Для Каждого Файл Из НайденныеФайлы Цикл Сообщить(Файл.Имя); КонецЦикла; КонецПроцедуры ПодключитьОбработчикОжидания("ПроверкаНаличияФайла", 10);
ActiveX
Как использовать элементы управления ActiveX?
Режим = РежимДиалогаВыбораФайла.Открытие; ДиалогФыбораФайла = Новый ДиалогВыбораФайла(Режим); ДиалогФыбораФайла.Фильтр = "Все файлы (все)|*.*"; ДиалогФыбораФайла.Заголовок = "Выберите медиа файл"; Если ДиалогФыбораФайла.Выбрать() Тогда ПутьКМедиаФайлу = ДиалогФыбораФайла.ПолноеИмяФайла; // В зависимости от варианта объекта запись полного пути к файлу // производится либо в свойство FileName, либо в свойство URL. Попытка ЭлементыФормы.WMP.FileName = ПутьКМедиаФайлу; Исключение ЭлементыФормы.WMP.URL = ПутьКМедиаФайлу; КонецПопытки; КонецЕсли;
Макеты ActiveDocument
Как сформировать новый договор на основании файла Microsoft Word?
Договор = ПолучитьМакет("Договор"); // Получить объект из макета. MSWord = Договор.Получить(); НаименованиеКонтрагента = "ООО Торгуем всем"; Попытка Документ = MSWord.Application.Documents(1); Документ.Activate(); // Получить объект, который будем использовать для поиска и замены. Замена = Документ.Content.Find; // Заменить заранее определенные ключевые конструкции на требуемый текст. Замена.Execute("<НазваниеКомпании>", Ложь, Истина, Ложь, , , Истина, , Ложь, НаименованиеКонтрагента); // Далее аналогично для остальных ключевых конструкций. // Делаем видимым приложение и активизируем его. MSWord.Application.Visible = Истина; MSWord.Activate(); Исключение // Если произойдет ошибка выводятся данные об ошибке и объект закрывается. Сообщить(ОписаниеОшибки()); MSWord.Application.Quit(); КонецПопытки;
Работа с Интернет
Работа с электронной почтой
Как организовать работу с электронной почтой через установленного почтового клиента?
Почта = Новый Почта; Почта.Подключиться("login", "password"); Сообщ = Новый ПочтовоеСообщение; Сообщ.Текст = "Доброе время суток!!!!"; Сообщ.Тема = "Срочно в номер!!!"; Данные = Новый ДвоичныеДанные("c:\attach.txt"); Сообщ.Вложения.Добавить(Данные,"attach.txt"); Сообщ.Получатели.Добавить("[email protected]"); Почта.Послать(Сообщ, Ложь); Почта.Отключиться();
Почта = Новый Почта; Почта.Подключиться("login", "password"); Выборка = Почта.Выбрать(Истина, Ложь); Для Каждого Сообщение Из Выборка Цикл Сообщить("Тема: " + Строка(Сообщение.Тема)); Сообщить("Текст: " + Строка(Сообщение.Текст)); Для Каждого Вложение Из Сообщение.Вложения Цикл Сообщить(Строка(Вложение.Наименование)); КонецЦикла; КонецЦикла;
Как организовать работу с почтой без установленного почтового клиента на компьютере пользователя?
// Сформировать почтовый профиль. // При отправке нет необходимости указывать настройки, связанные с POP сервером. ИПП = Новый ИнтернетПочтовыйПрофиль; ИПП.АдресСервераSMTP = Константы.АдресСервераSMTP.Получить(); ИПП.ВремяОжидания = Константы.ВремяОжидания.Получить(); ИПП.Пароль = Константы.Пароль.Получить(); ИПП.ПарольSMTP = Константы.ПарольSMTP.Получить(); ИПП.Пользователь = Константы.Пользователь.Получить(); ИПП.ПользовательSMTP = Константы.ПользовательSMTP.Получить(); ИПП.ПортSMTP = Константы.ПортSMTP.Получить(); // Создать сообщение. Сообщение = Новый ИнтернетПочтовоеСообщение; Сообщение.Получатели.Добавить("[email protected]"); Сообщение.Отправитель.Адрес = "[email protected]"; Сообщение.Тема = "Срочно в номер!"; Сообщение.Тексты.Добавить("Доброе время суток!"); Вложение = Новый ДвоичныеДанные(ПутьКФайлуВложения); Сообщение.Вложения.Добавить(Вложение,"attach.txt"); // Подключиться и отправить. Почта = Новый ИнтернетПочта; Почта.Подключиться(Профиль); Почта.Послать(Сообщение); Почта.Отключиться();
// Формирование почтового профиля. // При получении нет необходимости указывать настройки, связанные с SMTP сервером. СостояниеПриема = "Подключение к серверу"; ИПП = Новый ИнтернетПочтовыйПрофиль; ИПП.АдресСервераPOP3 = Константы.АдресСервераPOP3.Получить(); ИПП.ВремяОжидания = Константы.ВремяОжидания.Получить(); ИПП.Пароль = Константы.Пароль.Получить(); ИПП.Пользователь = Константы.Пользователь.Получить(); ИПП.ПортPOP3 = Константы.ПортPOP3.Получить(); Соединение = Новый ИнтернетПочта; Соединение.Подключиться(ИПП); СостояниеПриема = "Получение выборки писем"; Выборка = Соединение.Выбрать(ЗабиратьССервера); СостояниеПриема = "Создание документов - писем"; КоличествоВВыборке = Выборка.Количество(); Индекс = 1; Для Каждого Письмо Из Выборка Цикл ТекПозиция = Окр(Индекс*100/КоличествоВВыборке); Если ТекПозиция <> Позиция Тогда Позиция = ТекПозиция; КонецЕсли; Док = Документы.Письмо.СоздатьДокумент(); Док.Тема = Письмо.Тема; СтрПолучатели = ""; Для Каждого Адрес Из Письмо.Получатели Цикл СтрПолучатели = СтрПолучатели + Адрес.Адрес + ","; КонецЦикла; Док.Получатели = СтрПолучатели; Если ТипЗнч(Письмо.Отправитель) = Тип("Строка") Тогда Отправитель = Письмо.Отправитель; Иначе Отправитель = Письмо.Отправитель.Адрес; КонецЕсли; Док.Отправитель = Отправитель; Содержание = ""; Для Каждого ТекстСообщения Из Письмо.Тексты Цикл Содержание = Содержание + ТекстСообщения.Текст + Символы.ПС; КонецЦикла; Док.Содержание = Содержание; Индекс = Индекс + 1; Док.Записать(); КонецЦикла; Соединение.Отключиться();
Выполнение HTTP запроса
СерверИсточник = HTTPserver; Адрес = "/price.asp"; ИмяВходящегоФайла = "c:\temp\input.html"; НТТР = Новый HTTPСоединение(СерверИсточник); НТТР.Получить(Адрес, ИмяВходящегоФайла); ВходящийФайл = Новый Файл(ИмяВходящегоФайла);
Работа с COM-объектами
Как из одной базы 1С:Предприятие 8.0 перенести остатки товаров в другую базу, используя COM-соединение.
Запрос = Новый Запрос; Запрос.Текст= "ВЫБРАТЬ | ОстаткиТоваровОрганизацийОстатки.Организация КАК Организация, | ОстаткиТоваровОрганизацийОстатки.Номенклатура, | ОстаткиТоваровОрганизацийОстатки.ГТДОрганизации, | ОстаткиТоваровОрганизацийОстатки.СтранаПроисхождения, | ОстаткиТоваровОрганизацийОстатки.Комиссионер, | ОстаткиТоваровОрганизацийОстатки.КоличествоОстаток |ИЗ | РегистрНакопления.ОстаткиТоваровОрганизаций.Остатки(&ДатаПереноса, ) КАК ОстаткиТоваровОрганизацийОстатки |ИТОГИ ПО | Организация"; Запрос.УстановитьПараметр("ДатаПереноса", ДатаПереноса); V8 = Новый COMОбъект("V8.ComConnector"); Попытка Открытие = V8.Connect("File=""" + Путь + """;Usr=""Usr1"";"); Исключение Предупреждение("База данных не открыта!!!"); Возврат; КонецПопытки; Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам); МенеджерДокумента = Открытие.Документы.ОприходованиеТоваров; МенеджерНоменклатуры = Открытие.Справочники.Номенклатура; МенеджерОрганизаций = Открытие.Справочники.Организации; // Менеджеры остальных справочников: Пока Выборка.Следующий() Цикл Документ = МенеджерДокумента.СоздатьДокумент(); Код = Выборка.Организация.Код; Организация = МенеджерОрганизаций.НайтиПоКоду(Код); Если Организация.Пустая() Тогда Организация = МенеджерОрганизаций.СоздатьЭлемент(); Организация.Код = Код; // Остальные реквизиты: Организация.Записать(); КонецЕсли; // Обработка остальных реквизитов, справочников: ВыборкаПодчиненная = Выборка.Выбрать(); Пока ВыборкаПодчиненная.Следующий() Цикл // Поиск/перенос данных справочников // заполнение табличной части документа КонецЦикла; Документ.Записать(РежимЗаписиДокумента.Проведение); КонецЦикла;
Как выполнить запрос к произвольной базе данных SQL?
стрПодключения = "Driver={SQL Server};" стрПодключения = стрПодключения + ИмяСервера + ";"; стрПодключения = стрПодключения +"Uid=" + ИмяПользователя + ";"; стрПодключения = стрПодключения + "Pwd=" + Пароль + ";"; стрПодключения = стрПодключения + "DataBase =" + ИмяБазы + ";"; стрПодключения = стрПодключения + "Pwd=" + Пароль + ";"; Connection = Новый COMОбъект("ADODB.Connection"); Connection.OpenServer = стрПодключения; RS = Новый COMОбъект("ADODB.Recordset"); // Запрос к базе на языке SQL запросов. RS.Open("Select * from TradeUnit", Connection); Пока RS.EOF() = 0 Цикл // Можно обращаться и обрабатывать значения полей выборки. ИД = RS.Fields("ID").Value; Код = RS.Fields("Code").Value; // Обработка других полей RS.MoveNext(); КонецЦикла; RS.Close(); Connection.Close();
Отформатированные примеры из раздела "Интеграции" статьи https://infostart.ru/1c/articles/19343/