При построении интеграции между «1С:Предприятие» и системой раскроя листового материала Hypertherm ProNest разработчики часто используют встроенный механизм импорта и экспорта через файлы формата .pnl (Part Nest List). Этот формат представляет собой текстовую таблицу, содержащую сведения о деталях, чертежах и параметрах раскроя.
Однако при попытке программно отредактировать такой файл в 1С и загрузить его обратно в ProNest, пользователи часто сталкиваются с ошибкой чтения. Программа раскроя просто «не видит» или отказывается принимать измененный файл, хотя при визуальном сравнении текста в обычном блокноте структура и содержимое кажутся идентичными. Выясним причину этой проблемы и разберем по шагам, как правильно реализовать запись файла в нужной кодировке непосредственно из кода 1С.
Главная причина, по которой ProNest отказывается обрабатывать файлы после их перезаписи из 1С, кроется в несовместимости кодировок текста и отсутствии специального маркера в начале файла.
Проанализируем структуру исходного файла, экспортированного из ProNest. Он сохранен в двухбайтовой кодировке UCS-2 LE с BOM (в терминологии Windows и 1С она соответствует кодировке UTF-16 LE с маркером BOM).
Маркер BOM (Byte Order Mark) — это специальная последовательность байтов в самом начале текстового файла (для UTF-16 LE это байты FF FE), которая указывает сторонним программам на порядок следования байтов и тип кодировки. Если этот маркер отсутствует или файл сохранен в стандартной для СНГ кодировке Windows-1251 (ANSI) или UTF-8 без BOM, импорт в ProNest гарантированно завершится ошибкой.
Когда мы используем стандартный объект 1С ТекстовыйДокумент и метод Записать() без явного указания параметров, платформа по умолчанию сохраняет файл в кодировке UTF-8 (без BOM) либо в системной кодировке ANSI. В результате структура данных нарушается, и ProNest перестает распознавать заголовки столбцов и строки табличной части.
Для того чтобы быстро определить кодировку любого проблемного файла, рекомендуется использовать бесплатный текстовый редактор Notepad++. Выполним следующие действия:
.pnl в Notepad++.Убедившись в разнице кодировок, перейдем к исправлению алгоритма выгрузки в коде 1С.
Для того чтобы принудительно записать текстовый файл в кодировке UTF-16 с обязательным сохранением сигнатуры BOM, стандартного объекта ТекстовыйДокумент может быть недостаточно, либо потребуется использовать его перегруженные методы. Наиболее надежным и профессиональным способом является использование объекта ЗаписьТекста.
Рассмотрим пример кода, который считывает исходный файл-шаблон, производит в нем замену определенных текстовых значений (например, замену номенклатурных позиций или путей к файлам контуров деталей DXF) и сохраняет его в правильном формате, полностью совместимом с ProNest.
// 1. Выбор исходного файла шаблона PNL
ДиалогВыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие);
ДиалогВыбораФайла.МножественныйВыбор = Ложь;
ДиалогВыбораФайла.Заголовок = "Выберите исходный файл PNL";
ДиалогВыбораФайла.Фильтр = "Файлы раскроя (*.pnl)|*.pnl|Все файлы (*.*)|*.*";
Если НЕ ДиалогВыбораФайла.Выбрать() Тогда
Возврат;
КонецЕсли;
ПутьКИсходномуФайлу = ДиалогВыбораФайла.ПолноеИмяФайла;
// 2. Чтение файла шаблона
// Используем объект ТекстовыйДокумент для чтения содержимого
ТекстШаблона = Новый ТекстовыйДокумент;
ТекстШаблона.Прочитать(ПутьКИсходномуФайлу);
СодержимоеФайла = ТекстШаблона.ПолучитьТекст();
// 3. Производим необходимые манипуляции с текстом
// Например, заменим технологическое наименование материала или геометрию
СодержимоеФайла = СтрЗаменить(СодержимоеФайла, "звездочка", "уголок");
// 4. Выбор пути для сохранения нового файла
ДиалогСохранения = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);
ДиалогСохранения.Заголовок = "Сохранить измененный файл PNL";
ДиалогСохранения.Фильтр = "Файлы раскроя (*.pnl)|*.pnl";
Если НЕ ДиалогСохранения.Выбрать() Тогда
Возврат;
КонецЕсли;
ПутьКНовомуФайлу = ДиалогСохранения.ПолноеИмяФайла;
// 5. Запись файла в кодировке UTF-16 (UCS-2 LE с BOM)
// Используем объект ЗаписьТекста с явным указанием кодировки UTF16
// Это гарантирует запись BOM-маркера в начало файла
ЗаписьФайла = Новый ЗаписьТекста(ПутьКНовомуФайлу, КодировкаТекста.UTF16);
ЗаписьФайла.Записать(СодержимоеФайла);
ЗаписьФайла.Закрыть();
Предупреждение("Файл успешно перезаписан в кодировке UTF-16 LE с BOM!");
При использовании системного перечисления КодировкаТекста.UTF16 платформа «1С:Предприятие» автоматически создает текстовый файл в формате UTF-16 Little Endian и добавляет в его начало сигнатуру FF FE. Такой файл будет без проблем прочитан импортером ProNest.
Для успешной автоматизации обмена данными между 1С и ProNest важно учитывать не только кодировку, но и внутреннюю структуру самого файла:
.pnl в качестве разделителей данных используется знак табуляции. При генерации строк файла из 1С обязательно используйте символ Символы.Таб для разделения полей. Пример формирования строки данных:
СтрокаДанных = ИмяДетали + Символы.Таб + Количество + Символы.Таб + ПутьКФайлуDXF;
.pnl), для полноценного автоматического раскроя программе ProNest часто требуется список доступных листов (плит) на складе. Он передается в файле с аналогичным именем, но с расширением .snl. Правила работы с кодировкой для файлов .snl абсолютно идентичны правилам для .pnl.Если проект обмена данными развивается и требует высокой надежности и скорости работы, ручной или полуавтоматический обмен через текстовые файлы формата .pnl может стать узким горлышком системы. Рассмотрим более современные методы интеграции:
ЗаписьXML и ЧтениеXML полностью избавляет разработчика от необходимости вручную следить за кодировками файлов и разделителями колонок.Таким образом, своевременный контроль кодировок файлов при обмене данными и правильный выбор инструментов платформы 1С для работы с текстом позволяют избежать досадных ошибок и настроить бесперебойную интеграцию систем проектирования и учета.