Как исправить ошибку «Не заполнена колонка Курс расчетов» и программно изменить табличную часть документа в 1С

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

В практике работы с базами «1С:Предприятие 8.3» часто возникает ситуация, когда при попытке перепроведения старых документов (например, «Списание с расчетного счета») система выдает критическую ошибку: «Не заполнена колонка "Курс расчетов" в строке X списка "Расшифровка платежа"». Это происходит даже в тех случаях, когда в договорах и регистрах сведений курсы валют заполнены корректно. Рассмотрим подробно причины возникновения этой ошибки и разберем эффективные способы ее устранения: от использования встроенных инструментов до написания собственного кода.

Почему возникает ошибка при проведении старых документов

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

Выясним, почему нажатие на «калькулятор» в поле суммы документа помогает решить проблему вручную. В типовых конфигурациях (таких как «Бухгалтерия предприятия 3.0» или «ERP») на форме документа работают обработчики событий. При изменении суммы или нажатии на кнопку пересчета срабатывает программный код, который обращается к регистру сведений КурсыВалют, находит нужную запись на дату документа и заполняет скрытые или явные колонки в табличной части РасшифровкаПлатежа. Однако, если документов тысячи, делать это вручную невозможно. Нам требуется автоматизация.

Разбор типичных ошибок при программном изменении табличной части

Рассмотрим ситуацию, с которой сталкиваются многие начинающие разработчики. При попытке изменить данные документа «со стороны сервера» часто возникает сообщение о том, что табличная часть (ТЧ) доступна только для чтения. Проанализируем, почему это происходит.

Ошибка кроется в непонимании разницы между Ссылкой и Объектом. Вы не можете менять данные непосредственно в ДокументСсылка. Ссылка — это лишь указатель на запись в базе данных. Для внесения изменений необходимо получить объект документа в память сервера. Кроме того, табличная часть является коллекцией, а не простым значением. Посмотрим на типичный неправильный код:


// ОШИБОЧНЫЙ КОД
Док = Выборка.Ссылка;
Таб = Док.РасшифровкаПлатежа; // Здесь мы просто читаем данные
Таб[0].КурсВзаиморасчетов = 1; 
Док.Записать(); // У ссылки нет метода Записать()

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

Способ 1: Правильное программное изменение ТЧ через ДокументОбъект

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

Выполним следующий алгоритм кода:


// 1. Получаем объект из ссылки
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();

// 2. Перебираем строки табличной части "РасшифровкаПлатежа"
Для Каждого СтрокаТЧ Из ДокументОбъект.РасшифровкаПлатежа Цикл
    
    // Устанавливаем курс. Если расчеты в рублях, обычно это 1.
    // Если в валюте - можно вызвать функцию получения актуального курса.
    СтрокаТЧ.КурсВзаиморасчетов = 1;
    
    // Важно не забывать про кратность, иначе возникнет ошибка деления на ноль
    Если СтрокаТЧ.КратностьВзаиморасчетов = 0 Тогда
        СтрокаТЧ.КратностьВзаиморасчетов = 1;
    КонецЕсли;
    
КонецЦикла;

// 3. Записываем объект
// Используем РежимЗаписиДокумента.Запись, чтобы просто сохранить данные без проведения,
// Либо РежимЗаписиДокумента.Проведение, если хотим сразу провести.
Попытка
    ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
    Сообщить("Документ " + ДокументОбъект + " успешно обновлен.");
Исключение
    Сообщить("Не удалось записать документ: " + ОписаниеОшибки());
КонецПопытки;

Если вам необходимо заменить данные табличной части целиком (например, вы подготовили таблицу значений во внешней обработке), используйте метод Загрузить(). Посмотрим на пример:


// Выгружаем ТЧ в таблицу значений для сложных манипуляций
ТЗ = ДокументОбъект.РасшифровкаПлатежа.Выгрузить();

// Производим любые действия с ТЗ (поиск, удаление строк, расчеты)
Для Каждого СтрТЗ Из ТЗ Цикл
    СтрТЗ.КурсВзаиморасчетов = 1;
КонецЦикла;

// Загружаем данные обратно в объект документа
ДокументОбъект.РасшифровкаПлатежа.Загрузить(ТЗ);
ДокументОбъект.Записать();

Способ 2: Использование обработки «Групповое изменение реквизитов»

Проанализируем ситуацию, когда писать код не хочется или нет возможности. В типовых конфигурациях 1С (начиная с платформы 8.2 и 8.3) существует мощный инструмент — «Групповое изменение реквизитов». Это решение является наиболее безопасным и предпочтительным для администраторов баз данных.

Разберем процесс исправления курса по шагам:

  1. Откройте раздел Администрирование — Обслуживание — Корректировка данных — Групповое изменение реквизитов.
  2. В поле «Изменять» выберите тип документа (например, «Списание с расчетного счета»).
  3. Нажмите гиперссылку «Все элементы» и настройте отбор. Важно: обязательно выберите конкретный период или список документов, чтобы не затронуть лишние данные.
  4. Нажмите кнопку «Дополнительные параметры» (внизу или в меню «Настройки») и установите галочку «Показывать служебные реквизиты». Без этой настройки колонки табличных частей могут быть не видны.
  5. Найдите в списке реквизитов раздел, соответствующий вашей табличной части (например, Расшифровка платежа: Курс расчетов).
  6. Введите значение «1» в колонку «Новое значение».
  7. Нажмите кнопку «Изменить реквизиты».

Совет: После массового изменения реквизитов в старых документах их необходимо перепровести. Для этого воспользуйтесь обработкой «Групповое перепроведение документов», чтобы суммы правильно отразились в регистрах бухгалтерии.

Влияние удаления дублей на возникновение ошибки

Рассмотрим причину, упомянутую в обсуждении: удаление дублей. Когда вы используете стандартную обработку «Поиск и удаление дублей», система заменяет ссылки на договоры или валюты во всех документах. Однако при такой замене 1С просто переписывает ссылку в поле, но не пересчитывает связанные данные внутри табличных частей.

В результате получается «рассинхронизация»: договор в документе указан новый (правильный), но курс расчетов, который был привязан к старому (удаленному) объекту или просто отсутствовал, остается пустым. Именно поэтому после чистки базы от дублей часто требуется массовое обновление курсов в документах за прошлые периоды.

Рекомендации по автоматизации расчетов

Если вы разрабатываете собственную обработку для исправления данных, рекомендуем использовать экспортные процедуры из общих модулей конфигурации. Вместо того чтобы вручную проставлять единицу (СтрокаТЧ.КурсВзаиморасчетов = 1), лучше вызвать типовой механизм пересчета курса, который учтет валюту договора.

Например, в «Бухгалтерии предприятия 3.0» можно посмотреть, как реализовано заполнение курсов в модуле менеджера документа или обратиться к общему модулю РаботаСВалютами. Это позволит вашей обработке работать корректно не только с рублевыми операциями, но и с валютными платежами, автоматически подтягивая данные из истории курсов.

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

← На главную