Почему не записываются данные в новый ресурс регистра сведений после его добавления?

Программист 1С v8.3 (Обычные формы) Управленческий учет IT и автоматизация бизнеса
← На главную

При доработке типовых или самописных конфигураций на платформе 1С:Предприятие 8 программисты часто сталкиваются с ситуацией: в существующий регистр сведений добавлен новый ресурс, в коде проведения документа прописано его заполнение, но после проведения поле в регистре остается пустым. Давайте подробно разберем эту проблему, выясним возможные причины и найдем пошаговое решение.

Проанализируем исходную ситуацию

Представим, что у нас есть регистр сведений Цены, который подчинен регистратору. В нем уже существуют ресурсы Цена1, Цена2, Цена3. Мы добавляем новый ресурс Цена4. В модуле документа, который является регистратором, мы вносим изменения в процедуру обработки проведения:


Движение = Движения.Цены.Добавить();
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Цена1 = ТекСтрокаТовары.Цена1;
Движение.Цена2 = ТекСтрокаТовары.Цена2;
Движение.Цена3 = ТекСтрокаТовары.Цена3;
// Наш новый ресурс
Движение.Цена4 = ТекСтрокаТовары.Цена4;

Несмотря на то что код кажется верным, при просмотре записей регистра через интерфейс или консоль запросов мы видим, что Цена4 равна нулю или пуста. Рассмотрим основные причины такого поведения.

Шаг 1. Проверка типов данных и значений в источнике

Первым делом нам необходимо убедиться, что данные вообще передаются в переменную ТекСтрокаТовары.Цена4. Если в самой табличной части документа значение не заполнено или равно нулю, то и в регистр запишется ноль.

Важно проверить:

  1. Совпадают ли типы данных ресурса в регистре и реквизита в документе. Если в регистре это Число(15, 2), а в документе — Строка, автоматического приведения может не произойти, либо запишется ноль.
  2. Проанализируем ситуацию в отладчике. Установим точку останова на строке Движение.Цена4 = ТекСтрокаТовары.Цена4; и проверим значение в правой части выражения.

Шаг 2. Обновление конфигурации базы данных

Одной из самых коварных причин является так называемое «динамическое обновление» (или «демоническое», как его называют разработчики). Если вы обновили конфигурацию в режиме предприятия через «динамическое обновление», платформа могла не подхватить изменения метаданных для текущего сеанса.

Разберем алгоритм действий для исключения этой проблемы:

  1. Завершим все сеансы пользователей в базе.
  2. В Конфигураторе выполним команду «Конфигурация — Обновить конфигурацию базы данных» (клавиша F7). Если кнопка не активна, значит метаданные актуальны.
  3. Если обновление было динамическим, рекомендуется перезапустить службу сервера 1С или, как минимум, перезайти в клиентское приложение с параметром /ClearCache.

Шаг 3. Настройка состава движений в документе

В объекте метаданных «Документ» на закладке «Движения» перечислены регистры, по которым он может делать записи. Иногда, при добавлении нового ресурса в регистр, система не обновляет внутренние связи автоматически, особенно если вы используете «Конструктор движений».

Посмотрим, как это исправить:

Шаг 4. Анализ модуля набора записей регистра

Регистр сведений имеет свой собственный модуль. Выясним, нет ли там обработчиков, которые могут влиять на результат. Проанализируем события ПередЗаписью или ПриЗаписи в модуле набора записей регистра Цены.

Часто там встречается код для дополнительной валидации или пересчета цен. Если разработчик, создававший регистр, заложил логику очистки «неизвестных» или «дополнительных» полей, наш новый ресурс может обнуляться именно там.


// Пример опасного кода в модуле набора записей
Процедура ПередЗаписью(Отказ, Замещение)
    Для Каждого Запись Из ЭтотОбъект Цикл
        // Если кто-то забыл добавить проверку для Цена4
        Запись.Цена4 = ?(Запись.Цена1 > 0, Запись.Цена4, 0); 
    КонецЦикла;
КонецПроцедуры

Шаг 5. Проверка настроек формы (интерфейса)

Иногда проблема кроется не в записи данных, а в их отображении. Если мы смотрим на записи регистра через форму списка, новая колонка может быть просто скрыта настройками пользователя.

Выполним следующие действия:

  1. Откроем список регистра сведений.
  2. Нажмем «Еще» (или правую кнопку мыши) — «Изменить форму».
  3. Найдем в списке полей Цена4 и проверим, стоит ли напротив неё флажок видимости.
  4. Нажмем кнопку «Установить стандартные настройки», чтобы сбросить кэш пользовательских настроек формы.

Шаг 6. Проверка через Консоль запросов

Чтобы окончательно убедиться, записались ли данные в СУБД, минуя все экранные формы, используем «Консоль запросов». Напишем простой запрос:


ВЫБРАТЬ
    Цены.Номенклатура,
    Цены.Цена1,
    Цены.Цена2,
    Цены.Цена3,
    Цены.Цена4
ИЗ
    РегистрСведений.Цены КАК Цены
ГДЕ
    Цены.Регистратор = &СсылкаНаДокумент

Если в консоли запросов поле Цена4 заполнено — значит, проблема была исключительно в интерфейсе. Если же там 0 или NULL, значит, ошибка в коде проведения или в логике записи в базу.

Резюме

Для исправления ситуации мы должны действовать последовательно: сначала исключить программные ошибки (через отладку), затем проверить корректность обновления метаданных (F7 и очистка кэша) и в завершение проверить настройки визуализации. В большинстве случаев проблема оказывается связана либо с отсутствием данных в ТекСтрокаТовары, либо с тем, что конфигурация базы данных не была корректно обновлена после добавления нового ресурса.

← На главную