При обновлении конфигурации 1С:УПП (например, с версии 162 на 163 и выше) многие пользователи сталкиваются с необычными предупреждениями при запуске предприятия и кардинальными изменениями в коде документов. Основные вопросы вызывают сообщение о необходимости переноса выходных дней в производственном календаре и появление сложных конструкций кода с генерацией уникальных идентификаторов для строк табличных частей.
Разберем по шагам обе ситуации: выясним причину странного поведения календаря и проанализируем изменения в архитектуре УПП, связанные с учетом прослеживаемых товаров.
При первом запуске обновленной конфигурации система выдает предупреждение:
При заполнении календаря на 2022 год обнаружены государственные праздники, попадающие на выходные дни: 08 января - Новогодние каникулы. Необходимо перенести эти выходные дни на рабочие дни.
Давайте выясним причину такого сообщения. Оно напрямую связано с Постановлением Правительства РФ, регламентирующим производственный календарь на 2022 год. В том году 1 и 2 января выпали на выходные дни (субботу и воскресенье), и правительство перенесло их на 3 и 10 мая. Однако 8 января (также суббота и государственный праздник) никуда не переносилось.
Посмотрим на типовой алгоритм 1С, который обрабатывает заполнение календаря с переносами. Разработчики добавили специальное исключение для этой даты:
Функция ЗаполнениеКалендаряСПереносами(КонтрольнаяДата, ТаблицаПеренесенныхДней, Сообщать = Истина) Экспорт
// Не все попавшие на выходные праздники подлежат переносу:
// в период с 1 по 8 января переносится только два праздника.
// - в 2017 году 8 января переносить не надо
НайденныйЭлемент = СписокПраздниковВВыходные.НайтиПоЗначению('20170108');
Если НайденныйЭлемент <> Неопределено Тогда
СписокПраздниковВВыходные.Удалить(НайденныйЭлемент);
КонецЕсли;
// - в 2022 году 8 января переносить не надо (аналогичный код должен удалять 20220108)
Если Сообщать И СписокПраздниковВВыходные.Количество() > 0 Тогда
Сообщить("При заполнении календаря на " + Формат(Год(КонтрольнаяДата),"ЧЦ=4; ЧГ=0") + " год обнаружены государственные праздники, попадающие на выходные дни:");
Для Сч = 1 По СписокПраздниковВВыходные.Количество() Цикл
Сообщить(" " + Формат(СписокПраздниковВВыходные[Сч - 1].Значение, "ДФ ='дд ММММ'") + " - " + СписокПраздниковВВыходные[Сч - 1]);
КонецЦикла;
Сообщить("Необходимо перенести эти выходные дни на рабочие дни.", СтатусСообщения.Внимание);
КонецЕсли;
КонецФункции
Наличие праздника на выходном дне без официального переноса является нестандартной ситуацией для автоматики 1С. Система выдает информационное предупреждение, чтобы бухгалтер или кадровик вручную проверил календарь. С этим ничего делать не нужно, если графики работы сотрудников совпадают с утвержденным государственным календарем, достаточно просто принять эту информацию к сведению.
Проанализируем второе существенное изменение, которое бросается в глаза при отладке документов (таких как РеализацияТоваровУслуг или ТребованиеНакладная). Раньше для связи разных табличных частей (например, товаров и серий) использовался числовой реквизит КлючСвязи. Теперь вместо него появился ИдентификаторСтроки с типом "Строка (50)".
Рассмотрим код, который теперь генерирует эти идентификаторы в документах поступления и реализации:
Если СтрокаТабличнойЧасти.ИдентификаторСтроки = "0" Или СтрокаТабличнойЧасти.ИдентификаторСтроки = "" Тогда
СтрокаТабличнойЧасти.ИдентификаторСтроки = Строка(Новый УникальныйИдентификатор);
КонецЕсли;
Почему 1С перешла на громоздкие UUID вместо обычных чисел? Главная причина — внедрение Национальной системы прослеживаемости товаров (РНПТ) и форматов электронного документооборота (ЭДО).
Это позволяет жестко и без коллизий связывать конкретную строку табличной части документа с данными прослеживаемости (РНПТ, номерами ГТД) при передаче XML-файлов между контрагентами и ФНС.
Вместе с новыми реквизитами в 1С:УПП появились сложные алгоритмы обработки, свойственные конфигурациям на базе Библиотеки стандартных подсистем (БСП). Разберем пример процедуры очистки табличной части прослеживаемости:
Процедура ОтражатьВПрослеживаемостиПриИзменении(Элемент)
Если Не ЭлементыФормы.ОтражатьВПрослеживаемости.Значение Тогда
Для Каждого Строка Из Товары Цикл
Если Строка.ПрослеживаемыйТовар Тогда
НоваяСтрока = ТаблицаУдаленныхСтрок.Добавить();
НоваяСтрока.ИдентификаторСтроки = Строка.ИдентификаторСтроки;
КонецЕсли;
КонецЦикла;
ПодключитьОбработчикОжидания("Подключаемый_УдалитьСвязанныеЗаписи", 0.1, Истина);
КонецЕсли;
КонецПроцедуры
Процедура Подключаемый_УдалитьСвязанныеЗаписи()
УдалитьСвязанныеЗаписиНаСервере();
КонецПроцедуры
Процедура УдалитьСвязанныеЗаписиНаСервере()
Для Каждого СтрокаКлюча Из ТаблицаУдаленныхСтрок Цикл
СтруктураОтбора = Новый Структура("ИдентификаторСтроки", СтрокаКлюча.ИдентификаторСтроки);
МассивСтрокСведенияПрослеживаемости = СведенияПрослеживаемости.НайтиСтроки(СтруктураОтбора);
Для Каждого СтрокаТЧ Из МассивСтрокСведенияПрослеживаемости Цикл
СведенияПрослеживаемости.Удалить(СтрокаТЧ);
КонецЦикла;
КонецЦикла;
ТаблицаУдаленныхСтрок.Очистить();
КонецПроцедуры
Многих программистов возмущает, что простое удаление строк теперь выполняется через три процедуры и ПодключитьОбработчикОжидания. Причина кроется в архитектуре. 1С:УПП — устаревшая конфигурация. Чтобы оперативно поддерживать изменения в законодательстве (прослеживаемость, ЭДО, маркировка), разработчики 1С портируют готовые унифицированные блоки кода из современных конфигураций (ERP, КА, БП 3.0), построенных на управляемых формах и архитектуре клиент-серверного взаимодействия.
Эти новые блоки требуют строгого разделения логики, поэтому даже в УПП появляются обработчики, эмулирующие асинхронные вызовы и разбиение кода на клиентские и серверные процедуры. Это неизбежная плата за поддержание старой конфигурации в актуальном законодательном поле.