После проведения очередного обновления программного продукта 1С:Розница (особенно часто это происходит при переходе на новые субверсии в редакциях 2.2, 2.3 и 3.0) пользователи могут столкнуться со следующей неприятной ситуацией: при попытке открыть обработку печати ценников или при непосредственной отправке макета на печать система аварийно завершает операцию и выдает сообщение об ошибке: {(16, 12)} неверные параметры: "Справочник.СправкиБЕГАИС.ПустаяСсылка" Значение(Справочник.СправкиБЕГАИС.ПустаяСсылка) КАК СправкаБ. Примечательно, что данная проблема может возникать даже в тех торговых точках, которые никогда не осуществляли продажу алкогольной продукции, а в настройках параметров учета флаг «Алкогольная продукция» полностью отключен.
В рамках данной статьи мы подробно разберем, почему возникает этот сбой, проанализируем внутреннее устройство шаблонов ценников в системе 1С, а также рассмотрим по шагам несколько методов решения — от самых простых пользовательских действий до продвинутых программных способов исправления СКД (Схемы компоновки данных) без потери уникального дизайна ваших ценников.
Для того чтобы эффективно бороться с неисправностью, нам необходимо понять, что именно происходит на уровне платформы 1С при обновлении информационной базы. Рассмотрим детально цепочку событий:
СправкиБЕГАИС. Вместо него в конфигурации появились новые справочники (например, Справки1ЕГАИС и Справки2ЕГАИС).ХранилищеШаблонов. Каждый элемент этого справочника содержит двоичные данные, в которых упакована Схема компоновки данных (СКД). В этой схеме жестко прописан SQL-подобный текст запроса, который система использует для выборки данных о товарах, ценах, штрихкодах и характеристиках перед выводом на печать. В старых версиях запроса СКД присутствовало обращение к удаленному ныне объекту: ЗНАЧЕНИЕ(Справочник.СправкиБЕГАИС.ПустаяСсылка) КАК СправкаБ.СправкиБЕГАИС в метаданных конфигурации больше физически не существует, компилятор платформы прерывает работу с ошибкой совместимости типов, блокируя весь процесс печати.Официальная техподдержка 1С подтверждает, что данное поведение не классифицируется разработчиками как ошибка конфигурации. Ответственность за актуализацию пользовательских макетов возлагается на конечного пользователя или обслуживающего ИТ-специалиста. Следовательно, ждать автоматического исправления с новыми патчами бессмысленно — проблему нужно решать самостоятельно.
Проанализируем самый простой и быстрый способ, который помогает в большинстве стандартных ситуаций. Если ваш ценник создан на базе типового макета и не содержит сложных пользовательских доработок полей, система способна самостоятельно перезаписать СКД актуальным кодом из обновленной конфигурации при ручном сохранении элемента.
Выполним по шагам следующие действия в интерфейсе программы:
Во время процедуры записи система инициирует обновление структуры СКД, подтягивая новые правила сопоставления типов метаданных, и очистит некорректную ссылку на удаленный справочник ЕГАИС. После этого обязательно протестируем печать — в большинстве случаев работоспособность восстанавливается.
Иногда при попытке выполнить действия из Способа 1 пользователи сталкиваются с тем, что кнопка записи неактивна или программа выдает ошибку прав доступа/структуры данных. Разберем альтернативный алгоритм действий, который заставляет систему принудительно пересохранить параметры объекта:
ХранилищеШаблонов.Рассмотрим ситуацию, когда ваш шаблон ценника был разработан индивидуально (например, дизайнером или программистом), содержит уникальное оформление, логотипы, нетиповые шрифты и сложные формулы вывода цен. Если мы попытаемся пересохранить такой шаблон стандартным методом, или если мы решим просто создать новый шаблон «с нуля» — мы потеряем всю проделанную работу по дизайну макета.
Проблема в том, что при попытке войти в режим редактирования макета платформа сразу начинает проверять СКД, спотыкается на несуществующем справочнике СправкиБЕГАИС и намертво блокирует форму, не давая нам сохранить изменения. Получается замкнутый круг. Чтобы разорвать его, мы можем программно перенести «здоровую» (актуальную) СКД из нового чистого шаблона в наш старый красивый шаблон, не затрагивая при этом сам визуальный табличный документ.
Для выполнения этой процедуры нам понадобится запустить конфигуратор или использовать обработку «Консоль кода». Напишем и выполним следующий фрагмент кода:
&НаСервере
Процедура ИсправитьСхемуКомпоновкиШаблона(ИмяСломанногоШаблона, ИмяНовогоШаблона)
// Получаем ссылки на сломанный пользовательский шаблон и новый чистый шаблон-донор
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ХранилищеШаблонов.Ссылка КАК Ссылка,
| ХранилищеШаблонов.Наименование КАК Наименование
|ИЗ
| Справочник.ХранилищеШаблонов КАК ХранилищеШаблонов
|ГДЕ
| ХранилищеШаблонов.Наименование В (&Имена)";
МассивИмен = Новый Массив;
МассивИмен.Добавить(ИмяСломанногоШаблона);
МассивИмен.Добавить(ИмяНовогоШаблона);
Запрос.УстановитьПараметр("Имена", МассивИмен);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
СломанныйОбъект = Неопределено;
НовыйОбъект = Неопределено;
Пока Выборка.Следующий() Цикл
Если Выборка.Наименование = ИмяСломанногоШаблона Тогда
СломанныйОбъект = Выборка.Ссылка.ПолучитьОбъект();
ИначеЕсли Выборка.Наименование = ИмяНовогоШаблона Тогда
НовыйОбъект = Выборка.Ссылка.ПолучитьОбъект();
КонецЕсли;
КонецЦикла;
Если СломанныйОбъект <> Неопределено И НовыйОбъект <> Неопределено Тогда
// Копируем правильную двоичную схему из донора в наш рабочий шаблон
СломанныйОбъект.СхемаКомпоновкиДанных = Новый ХранилищеЗначения(НовыйОбъект.СхемаКомпоновкиДанных.Получить());
СломанныйОбъект.Записать();
Сообщить("Схема компоновки данных успешно восстановлена. Визуальный макет сохранен!");
Иначе
Сообщить("Внимание! Проверьте правильность написания наименований шаблонов.");
КонецЕсли;
КонецПроцедуры
Перед запуском этого кода предварительно создайте один новый пустой шаблон по умолчанию (он будет выступать в роли донора с чистой СКД) и укажите его наименование в качестве второго параметра процедуры. После выполнения этого скрипта ваш старый макет вернет полную работоспособность, сохранив все дизайнерские наработки.
Для наиболее опытных администраторов и программистов рассмотрим самый элегантный способ — точечное редактирование XML-кода схемы компоновки данных. Этот метод позволяет не перезаписывать схему полностью (как в Способе 3), а лишь удалить или переименовать проблемный участок кода в схеме.
Алгоритм действий выглядит следующим образом:
СхемаКомпоновкиДанных поврежденного элемента справочника ХранилищеШаблонов.Справочник.СправкиБЕГАИС.ПустаяСсылка.Справочник.Справки2ЕГАИС.ПустаяСсылка, либо полностью вырезаем это поле из запроса СКД, если учет алкоголя в системе не планируется.ХранилищеЗначения.Этот подход гарантирует 100% сохранение всех связей полей, пользовательских настроек компоновки и внешнего вида ценника при минимальном вмешательстве в логику работы системы.
Проанализировав проблему, мы можем сделать важный вывод: регулярные обновления конфигураций 1С неизбежно приводят к изменению структуры метаданных. Чтобы минимизировать риски возникновения подобных сбоев при последующих обновлениях, рекомендуем придерживаться нескольких простых правил:
ХранилищеШаблонов и своевременно удаляйте устаревшие элементы, чтобы они не вызывали ошибок при обновлении базы данных.