При доработке типовых или самописных конфигураций на платформе 1С:Предприятие 8 программисты часто сталкиваются с ситуацией: в существующий регистр сведений добавлен новый ресурс, в коде проведения документа прописано его заполнение, но после проведения поле в регистре остается пустым. Давайте подробно разберем эту проблему, выясним возможные причины и найдем пошаговое решение.
Представим, что у нас есть регистр сведений Цены, который подчинен регистратору. В нем уже существуют ресурсы Цена1, Цена2, Цена3. Мы добавляем новый ресурс Цена4. В модуле документа, который является регистратором, мы вносим изменения в процедуру обработки проведения:
Движение = Движения.Цены.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Цена1 = ТекСтрокаТовары.Цена1;
Движение.Цена2 = ТекСтрокаТовары.Цена2;
Движение.Цена3 = ТекСтрокаТовары.Цена3;
// Наш новый ресурс
Движение.Цена4 = ТекСтрокаТовары.Цена4;
Несмотря на то что код кажется верным, при просмотре записей регистра через интерфейс или консоль запросов мы видим, что Цена4 равна нулю или пуста. Рассмотрим основные причины такого поведения.
Первым делом нам необходимо убедиться, что данные вообще передаются в переменную ТекСтрокаТовары.Цена4. Если в самой табличной части документа значение не заполнено или равно нулю, то и в регистр запишется ноль.
Важно проверить:
Число(15, 2), а в документе — Строка, автоматического приведения может не произойти, либо запишется ноль.Движение.Цена4 = ТекСтрокаТовары.Цена4; и проверим значение в правой части выражения.Одной из самых коварных причин является так называемое «динамическое обновление» (или «демоническое», как его называют разработчики). Если вы обновили конфигурацию в режиме предприятия через «динамическое обновление», платформа могла не подхватить изменения метаданных для текущего сеанса.
Разберем алгоритм действий для исключения этой проблемы:
/ClearCache.В объекте метаданных «Документ» на закладке «Движения» перечислены регистры, по которым он может делать записи. Иногда, при добавлении нового ресурса в регистр, система не обновляет внутренние связи автоматически, особенно если вы используете «Конструктор движений».
Посмотрим, как это исправить:
Цена4 выбрана и сопоставлена с соответствующим полем документа.Регистр сведений имеет свой собственный модуль. Выясним, нет ли там обработчиков, которые могут влиять на результат. Проанализируем события ПередЗаписью или ПриЗаписи в модуле набора записей регистра Цены.
Часто там встречается код для дополнительной валидации или пересчета цен. Если разработчик, создававший регистр, заложил логику очистки «неизвестных» или «дополнительных» полей, наш новый ресурс может обнуляться именно там.
// Пример опасного кода в модуле набора записей
Процедура ПередЗаписью(Отказ, Замещение)
Для Каждого Запись Из ЭтотОбъект Цикл
// Если кто-то забыл добавить проверку для Цена4
Запись.Цена4 = ?(Запись.Цена1 > 0, Запись.Цена4, 0);
КонецЦикла;
КонецПроцедуры
Иногда проблема кроется не в записи данных, а в их отображении. Если мы смотрим на записи регистра через форму списка, новая колонка может быть просто скрыта настройками пользователя.
Выполним следующие действия:
Цена4 и проверим, стоит ли напротив неё флажок видимости.Чтобы окончательно убедиться, записались ли данные в СУБД, минуя все экранные формы, используем «Консоль запросов». Напишем простой запрос:
ВЫБРАТЬ
Цены.Номенклатура,
Цены.Цена1,
Цены.Цена2,
Цены.Цена3,
Цены.Цена4
ИЗ
РегистрСведений.Цены КАК Цены
ГДЕ
Цены.Регистратор = &СсылкаНаДокумент
Если в консоли запросов поле Цена4 заполнено — значит, проблема была исключительно в интерфейсе. Если же там 0 или NULL, значит, ошибка в коде проведения или в логике записи в базу.
Для исправления ситуации мы должны действовать последовательно: сначала исключить программные ошибки (через отладку), затем проверить корректность обновления метаданных (F7 и очистка кэша) и в завершение проверить настройки визуализации. В большинстве случаев проблема оказывается связана либо с отсутствием данных в ТекСтрокаТовары, либо с тем, что конфигурация базы данных не была корректно обновлена после добавления нового ресурса.