При подготовке ежегодной пенсионной отчетности по форме СЗВ-СТАЖ и сопутствующей описи ОДВ-1 в конфигурациях на платформе 1С:Предприятие 7.7 (в частности, в «Зарплата и Кадры 7.7», ред. 7.70.366 и смежных решениях) пользователи и программисты сталкиваются с рядом критических сбоев. Программа может аварийно завершать работу с ошибкой AppCrash при обработке сотен сотрудников, выдавать синтаксические ошибки при проверке выгруженных файлов или выдавать исключения при формировании печатных форм.
Разберем детально причины возникновения этих проблем и проанализируем практические способы их устранения.
Проанализируем техническую сторону формирования XML-файлов в среде 1С 7.7. Платформа изначально работает с однобайтовой кодировкой ANSI (Windows-1251) и не имеет встроенных нативных механизмов прямой потоковой записи в кодировке UTF-8. Для решения этой задачи в типовых модулях отчетности разработчики используют системный COM-объект Windows ADODB.Stream.
Посмотрим на типовой проблемный участок кода выгрузки:
// Сохраняем файл в кодировке UTF-8
АдоДБСтрим = CreateObject("Adodb.Stream");
АдоДБСтрим.Charset = "windows-1251";
АдоДБСтрим.Type = 2; // adTypeText
АдоДБСтрим.Mode = 3; // adModeReadWrite
АдоДБСтрим.Open();
АдоДБСтрим.LoadFromFile(ПолноеИмяФайла);
ТекстАдоДБСтрим = АдоДБСтрим.ReadText();
АдоДБСтрим.Close();
АдоДБСтрим.Charset = "utf-8";
АдоДБСтрим.Open();
АдоДБСтрим.WriteText(ТекстАдоДБСтрим);
АдоДБСтрим.SaveToFile(ПолноеИмяФайла, 2);
АдоДБСтрим.Close();
Выясним, почему возникает падение процесса 1cv7s.exe. Когда в организации числится большое количество сотрудников (от 100–300 человек и более), переменная ТекстАдоДБСтрим превращается в гигантскую непрерывную строку. При вызове метода WriteText() для единого текстового массива сверхбольшого объема компонент ADODB.Stream вызывает переполнение внутреннего буфера, что приводит к необрабатываемому системному сбою памяти (AppCrash) и мгновенному закрытию 1С.
Рассмотрим варианты обхода и решения этой проблемы:
WriteText() можно разбить длинный текст на строки или блоки фиксированного размера (например, по 4096–8192 символов) и передавать их в поток последовательно в цикле.ADODB.Stream. Файл останется на диске в кодировке Windows-1251. После этого перекодируем сформированный XML-файл в кодировку UTF-8 (без BOM) с помощью любого внешнего консольного конвертера, текстового редактора (например, Notepad++ или встроенного редактора FAR Manager) либо скрипта.encoding="UTF-8" на encoding="windows-1251", после чего загрузим файл в официальную программу «СПУ-ОРБ». Программа ПФР корректно прочитает файл, перекодирует его в UTF-8 и выгрузит готовый итоговый пакет.При нажатии на кнопку печати описи ОДВ-1 в модуле отчета ПодготовкаСведенийДляПФР2017 может появляться исключение вида:
Таб.ИсходнаяТаблица("ОДВ_1");
{Отчет.ПодготовкаСведенийДляПФР2017.Форма.Модуль(1258)}: Неверное имя ОДВ_1
Разберем структуру метаданных конфигурации, чтобы понять источник ошибки. В типовом обновлении ЗиК 7.7 печатный макет ОДВ_1 разработчики разместили не внутри таблицы конкретного отчета, а в ветке метаданных Общие таблицы всей конфигурации. Если обновление на новый релиз выполнялось путем частичного переноса только внешних отчетов или без корректного объединения метаданных файла конфигурации 1cv7.md, то таблица макета в базе просто отсутствует.
Для устранения ошибки выполним следующие действия:
1cv7.md релиза 366 или выше).ОДВ_1).Часто бухгалтеры и технические специалисты получают сообщения о нераспознанном формате или синтаксических ошибках в заголовках XML сразу после формирования пакета.
Проанализируем работу проверочных утилит:
CheckXML не поддерживает и воспринимает XML-структуру как поврежденную.Если в файле присутствуют сотрудники с льготным стажем (вредные и тяжелые условия труда), важно помнить, что сведения по ним сопровождаются обязательным заполнением Раздела 5 формы ОДВ-1. В случае выявления расхождений после отправки исходных сведений корректирующие формы формируются с типом СЗВ-КОРР, при этом проверку сформированного пакета также следует выполнять исключительно через актуальную версию CheckPFR.