При первичной настройке интеграции с государственной системой «Меркурий» (ВетИС) через программный интерфейс API в конфигурациях 1С пользователи часто сталкиваются с неожиданным препятствием. Сразу после ввода учетных данных и попытки создать новое подключение система выдает критическую ошибку: «Запись не верна! Значение поля "Группа приказа" не может быть пустым!: ВидыПродукцииПоГруппамВетис:Аттестованный специалист». Эта ошибка полностью блокирует дальнейший процесс настройки обмена и не позволяет завершить сопоставление данных.
В этой статье мы подробно разберем, почему возникает этот сбой, проанализируем его техническую суть и рассмотрим три практических способа решения проблемы: от простого обновления системы до ручного исправления данных и написания корректирующего скрипта.
Для того чтобы понять, почему система ведет себя подобным образом, обратимся к законодательной базе и логике работы ветеринарного контроля. Согласно нормативным актам Минсельхоза РФ, права на оформление ветеринарно-сопроводительных документов (ВСД) в системе «Меркурий» строго разграничены в зависимости от квалификации и статуса пользователя:
В коде программных решений 1С (это касается конфигураций «1С:Розница», «1С:Управление торговлей», «1С:ERP», «1С:Комплексная автоматизация» и «1С:Бухгалтерия») за сопоставление этих приказов, групп продукции и уровней доступа отвечает специальный регистр сведений ВидыПродукцииПоГруппамВЕТИС. В структуре метаданных этого регистра для измерения или реквизита ГруппаПриказа программно установлено жесткое ограничение: «Запретить пустые значения».
При первом подключении к ВетИС программа в фоновом режиме пытается автоматически заполнить этот регистр стандартными предопределенными настройками. Однако из-за внутренней ошибки в программном коде библиотеки интеграции (БЭД), которая поставлялась в ряде релизов, для записи с типом доступа АттестованныйСпециалист реквизит ГруппаПриказа оставался незаполненным. Платформа 1С обнаруживает попытку записать в базу данных строку с пустым обязательным полем, срабатывает системное ограничение, и транзакция аварийно прерывается с выводом сообщения об ошибке.
Давайте разберем по шагам, как мы можем обойти или полностью устранить эту проблему в вашей информационной базе.
Поскольку данная проблема официально признана разработчиками фирмы «1С» как программная ошибка релиза, самым правильным и долгосрочным решением является обновление конфигурации до актуальной версии.
Если мы используем программу «1С:Розница 2.3», то данная ошибка была полностью устранена, начиная с релиза 2.3.3.31 и во всех последующих версиях ветки 2.3 и 3.0. Если у вас установлена более ранняя версия, выполним следующие действия:
.dt или копию файла 1Cv8.1CD). Никогда не пренебрегайте этим шагом перед проведением любых обновлений!Если ваша конфигурация существенно доработана программистами и быстрое обновление типовыми средствами невозможно, проверим наличие официальных исправлений (патчей):
Если у нас нет возможности обновить программу прямо сейчас, а настроить интеграцию с ВетИС нужно срочно, мы можем обойти ошибку платформы, заполнив проблемную строку в регистре вручную. Для этого воспользуемся встроенным инструментом для администраторов.
Проанализируем последовательность действий для ручной корректировки данных:
Виды продукции по группам ВЕТИС (в метаданных он может отображаться латиницей как ВидыПродукцииПоГруппамВЕТИС). Откроем его двойным щелчком мыши.После ручного заполнения этого поля платформа перестанет ругаться на незаполненные реквизиты, и вы сможете беспрепятственно продолжить создание подключения в панели обмена с ВетИС.
Иногда ручное редактирование регистра заблокировано на уровне интерфейса конфигурации, либо строк оказывается слишком много, либо система выдает ошибки блокировки при попытке интерактивного изменения. В таком случае мы можем прибегнуть к программному методу исправления данных. Для этого напишем и выполним простой скрипт на встроенном языке 1С, запустив его через внешнюю обработку.
Рассмотрим структуру и логику работы программного кода, который принудительно запишет верное значение в базу данных:
// Создаем объект для работы с набором записей регистра сведений
НаборЗаписей = РегистрыСведений.ВидыПродукцииПоГруппамВЕТИС.СоздатьНаборЗаписей();
// Устанавливаем жесткий отбор по проблемному измерению регистра
НаборЗаписей.Отбор.УровеньДоступа.Установить(Перечисления.УровниДоступаВЕТИС.АттестованныйСпециалист);
// Считываем существующие записи из базы данных по нашему отбору
НаборЗаписей.Прочитать();
// Обходим полученный набор в цикле и заполняем пустые реквизиты
Для Каждого Запись Из НаборЗаписей Цикл
Если Не ЗначениеЗаполнено(Запись.ГруппаПриказа) Тогда
// Выполняем поиск ссылки на нужную группу приказа по коду "647"
СсылкаНаПриказ = Справочники.ГруппыПриказовВЕТИС.НайтиПоРеквизиту("Код", "647");
// Если поиск по коду не дал результатов, пробуем найти элемент по наименованию
Если Не ЗначениеЗаполнено(СсылкаНаПриказ) Тогда
СсылкаНаПриказ = Справочники.ГруппыПриказовВЕТИС.НайтиПоНаименованию("Приказ № 647");
КонецЕсли;
// Присваиваем найденную ссылку реквизиту записи
Если ЗначениеЗаполнено(СсылкаНаПриказ) Тогда
Запись.ГруппаПриказа = СсылкаНаПриказ;
КонецЕсли;
КонецЕсли;
КонецЦикла;
// Записываем обновленный набор записей обратно в базу данных с отключением проверок
Попытка
НаборЗаписей.Записать(Истина);
Сообщить("Корректировка регистра ВидыПродукцииПоГруппамВЕТИС выполнена успешно!");
Исключение
Сообщить("Не удалось записать изменения. Причина: " + ОписаниеОшибки());
КонецПопытки;
Давайте подробно проанализируем, как работает данный скрипт:
СоздатьНаборЗаписей() инициализирует пустую выборку для работы с конкретным регистром сведений.НаборЗаписей.Отбор.УровеньДоступа.Установить(...) накладывает фильтр, чтобы мы случайно не перезаписали настройки для других типов пользователей (например, уполномоченных лиц или госврачей), чьи настройки заполнены корректно.НаборЗаписей.Прочитать() наполняет наш объект данными из базы, соответствующими установленному отбору.ЗначениеЗаполнено(). Если поле пустое, мы осуществляем поиск ссылки на правильный элемент справочника ГруппыПриказовВЕТИС с помощью методов НайтиПоРеквизиту() или НайтиПоНаименованию().НаборЗаписей.Записать(Истина) производит непосредственную запись изменений в базу данных. Параметр Истина указывает платформе на необходимость замещения существующих записей в рамках установленного отбора.Запустить этот код можно, создав простую внешнюю обработку в режиме Конфигуратор, разместив данный текст в обработчике нажатия кнопки на форме и открыв эту обработку в режиме предприятия через меню Файл - Открыть.
Мы детально рассмотрели проблему интеграции 1С с ВетИС (Меркурий) и убедились, что пугающая ошибка при создании подключения — это всего лишь следствие допущенной разработчиками опечатки в процедурах первоначального заполнения регистров.
Для предотвращения подобных сложностей в будущем мы рекомендуем придерживаться следующих правил при работе с государственными информационными системами в 1С: