В практике работы с базами «1С:Предприятие 8.3» часто возникает ситуация, когда при попытке перепроведения старых документов (например, «Списание с расчетного счета») система выдает критическую ошибку: «Не заполнена колонка "Курс расчетов" в строке X списка "Расшифровка платежа"». Это происходит даже в тех случаях, когда в договорах и регистрах сведений курсы валют заполнены корректно. Рассмотрим подробно причины возникновения этой ошибки и разберем эффективные способы ее устранения: от использования встроенных инструментов до написания собственного кода.
Давайте проанализируем ситуацию. Ошибка «Не заполнена колонка Курс расчетов» чаще всего проявляется в документах, которые были созданы давно или перенесены из других баз. Основная причина заключается в том, что в модуле проведения документа стоит жесткая проверка на наличие значения в реквизитах табличной части, отвечающих за валютный учет. Если реквизит КурсВзаиморасчетов или КратностьВзаиморасчетов пуст (равен нулю), проведение становится невозможным.
Выясним, почему нажатие на «калькулятор» в поле суммы документа помогает решить проблему вручную. В типовых конфигурациях (таких как «Бухгалтерия предприятия 3.0» или «ERP») на форме документа работают обработчики событий. При изменении суммы или нажатии на кнопку пересчета срабатывает программный код, который обращается к регистру сведений КурсыВалют, находит нужную запись на дату документа и заполняет скрытые или явные колонки в табличной части РасшифровкаПлатежа. Однако, если документов тысячи, делать это вручную невозможно. Нам требуется автоматизация.
Рассмотрим ситуацию, с которой сталкиваются многие начинающие разработчики. При попытке изменить данные документа «со стороны сервера» часто возникает сообщение о том, что табличная часть (ТЧ) доступна только для чтения. Проанализируем, почему это происходит.
Ошибка кроется в непонимании разницы между Ссылкой и Объектом. Вы не можете менять данные непосредственно в ДокументСсылка. Ссылка — это лишь указатель на запись в базе данных. Для внесения изменений необходимо получить объект документа в память сервера. Кроме того, табличная часть является коллекцией, а не простым значением. Посмотрим на типичный неправильный код:
// ОШИБОЧНЫЙ КОД
Док = Выборка.Ссылка;
Таб = Док.РасшифровкаПлатежа; // Здесь мы просто читаем данные
Таб[0].КурсВзаиморасчетов = 1;
Док.Записать(); // У ссылки нет метода Записать()
Второй важный нюанс: нельзя заменить одну табличную часть другой через оператор присваивания (равно). Например, конструкция Док.РасшифровкаПлатежа = ТаблицаЗначений всегда будет выдавать ошибку, так как свойство табличной части доступно только для чтения в плане установки всей коллекции целиком. Однако состав этой коллекции (строки и их реквизиты) менять можно и нужно.
Рассмотрим по шагам, как правильно изменить реквизиты в табличной части документа. Нам необходимо получить объект, перебрать строки ТЧ, изменить нужные значения и вызвать процедуру записи.
Выполним следующий алгоритм кода:
// 1. Получаем объект из ссылки
ДокументОбъект = СсылкаНаДокумент.ПолучитьОбъект();
// 2. Перебираем строки табличной части "РасшифровкаПлатежа"
Для Каждого СтрокаТЧ Из ДокументОбъект.РасшифровкаПлатежа Цикл
// Устанавливаем курс. Если расчеты в рублях, обычно это 1.
// Если в валюте - можно вызвать функцию получения актуального курса.
СтрокаТЧ.КурсВзаиморасчетов = 1;
// Важно не забывать про кратность, иначе возникнет ошибка деления на ноль
Если СтрокаТЧ.КратностьВзаиморасчетов = 0 Тогда
СтрокаТЧ.КратностьВзаиморасчетов = 1;
КонецЕсли;
КонецЦикла;
// 3. Записываем объект
// Используем РежимЗаписиДокумента.Запись, чтобы просто сохранить данные без проведения,
// Либо РежимЗаписиДокумента.Проведение, если хотим сразу провести.
Попытка
ДокументОбъект.Записать(РежимЗаписиДокумента.Запись);
Сообщить("Документ " + ДокументОбъект + " успешно обновлен.");
Исключение
Сообщить("Не удалось записать документ: " + ОписаниеОшибки());
КонецПопытки;
Если вам необходимо заменить данные табличной части целиком (например, вы подготовили таблицу значений во внешней обработке), используйте метод Загрузить(). Посмотрим на пример:
// Выгружаем ТЧ в таблицу значений для сложных манипуляций
ТЗ = ДокументОбъект.РасшифровкаПлатежа.Выгрузить();
// Производим любые действия с ТЗ (поиск, удаление строк, расчеты)
Для Каждого СтрТЗ Из ТЗ Цикл
СтрТЗ.КурсВзаиморасчетов = 1;
КонецЦикла;
// Загружаем данные обратно в объект документа
ДокументОбъект.РасшифровкаПлатежа.Загрузить(ТЗ);
ДокументОбъект.Записать();
Проанализируем ситуацию, когда писать код не хочется или нет возможности. В типовых конфигурациях 1С (начиная с платформы 8.2 и 8.3) существует мощный инструмент — «Групповое изменение реквизитов». Это решение является наиболее безопасным и предпочтительным для администраторов баз данных.
Разберем процесс исправления курса по шагам:
Расшифровка платежа: Курс расчетов).Совет: После массового изменения реквизитов в старых документах их необходимо перепровести. Для этого воспользуйтесь обработкой «Групповое перепроведение документов», чтобы суммы правильно отразились в регистрах бухгалтерии.
Рассмотрим причину, упомянутую в обсуждении: удаление дублей. Когда вы используете стандартную обработку «Поиск и удаление дублей», система заменяет ссылки на договоры или валюты во всех документах. Однако при такой замене 1С просто переписывает ссылку в поле, но не пересчитывает связанные данные внутри табличных частей.
В результате получается «рассинхронизация»: договор в документе указан новый (правильный), но курс расчетов, который был привязан к старому (удаленному) объекту или просто отсутствовал, остается пустым. Именно поэтому после чистки базы от дублей часто требуется массовое обновление курсов в документах за прошлые периоды.
Если вы разрабатываете собственную обработку для исправления данных, рекомендуем использовать экспортные процедуры из общих модулей конфигурации. Вместо того чтобы вручную проставлять единицу (СтрокаТЧ.КурсВзаиморасчетов = 1), лучше вызвать типовой механизм пересчета курса, который учтет валюту договора.
Например, в «Бухгалтерии предприятия 3.0» можно посмотреть, как реализовано заполнение курсов в модуле менеджера документа или обратиться к общему модулю РаботаСВалютами. Это позволит вашей обработке работать корректно не только с рублевыми операциями, но и с валютными платежами, автоматически подтягивая данные из истории курсов.
Таким образом, решение проблемы «Не заполнена колонка Курс расчетов» сводится либо к грамотному программному перебору строк объекта документа, либо к использованию стандартного инструмента групповой правки реквизитов с включенным отображением служебных полей.