Как из 1С правильно отредактировать и сохранить файл формата PNL для программы раскроя ProNest

Программист 1С v8.3 (Обычные формы) Управленческий учет Промышленность, строительство и АПК
← На главную

При построении интеграции между «1С:Предприятие» и системой раскроя листового материала Hypertherm ProNest разработчики часто используют встроенный механизм импорта и экспорта через файлы формата .pnl (Part Nest List). Этот формат представляет собой текстовую таблицу, содержащую сведения о деталях, чертежах и параметрах раскроя.

Однако при попытке программно отредактировать такой файл в 1С и загрузить его обратно в ProNest, пользователи часто сталкиваются с ошибкой чтения. Программа раскроя просто «не видит» или отказывается принимать измененный файл, хотя при визуальном сравнении текста в обычном блокноте структура и содержимое кажутся идентичными. Выясним причину этой проблемы и разберем по шагам, как правильно реализовать запись файла в нужной кодировке непосредственно из кода 1С.

В чем причина сбоя импорта файлов в ProNest?

Главная причина, по которой 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 перестает распознавать заголовки столбцов и строки табличной части.

Шаг 1. Анализ кодировки файла с помощью Notepad++

Для того чтобы быстро определить кодировку любого проблемного файла, рекомендуется использовать бесплатный текстовый редактор Notepad++. Выполним следующие действия:

  1. Откроем оригинальный (работающий) файл .pnl в Notepad++.
  2. Посмотрим в правый нижний угол окна программы — там будет отображаться текущая кодировка файла (например, UCS-2 LE BOM).
  3. Откроем измененный в 1С файл, который ProNest не может прочитать. Мы увидим там кодировку UTF-8 или ANSI (Windows-1251).

Убедившись в разнице кодировок, перейдем к исправлению алгоритма выгрузки в коде 1С.

Шаг 2. Реализация корректной записи файла в UTF-16 LE с BOM из 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.

Особенности структуры файлов PNL и важные нюансы обмена

Для успешной автоматизации обмена данными между 1С и ProNest важно учитывать не только кодировку, но и внутреннюю структуру самого файла:

Альтернативные варианты интеграции 1С и ProNest

Если проект обмена данными развивается и требует высокой надежности и скорости работы, ручной или полуавтоматический обмен через текстовые файлы формата .pnl может стать узким горлышком системы. Рассмотрим более современные методы интеграции:

  1. Использование формата XML: Современные версии ProNest поддерживают загрузку заданий на раскрой через структурированные XML-файлы. Работа с XML в 1С гораздо более стандартизирована. Использование объектов ЗаписьXML и ЧтениеXML полностью избавляет разработчика от необходимости вручную следить за кодировками файлов и разделителями колонок.
  2. Прямая интеграция на уровне базы данных (MS SQL / MS Access): База данных ProNest является открытой. Вы можете настроить прямое подключение из 1С к СУБД ProNest через механизмы ADO (ActiveX Data Objects) или посредством внешних источников данных 1С. Это позволяет напрямую записывать заказы на раскрой в таблицы очереди импорта ProNest и оперативно считывать результаты выполнения раскроя (коэффициент использования металла, фактическое время резки, количество отходов) обратно в 1С для автоматического списания материалов.

Таким образом, своевременный контроль кодировок файлов при обмене данными и правильный выбор инструментов платформы 1С для работы с текстом позволяют избежать досадных ошибок и настроить бесперебойную интеграцию систем проектирования и учета.

← На главную