При активной работе в программных продуктах фирмы 1С, особенно в процессе реорганизации структуры компании, часто возникает необходимость массово заменить одно значение на другое во всех документах и регистрах системы. Традиционным инструментом для решения этой задачи долгое время оставалась универсальная внешняя обработка ПоискИЗаменаЗначений. Однако при попытке заменить такие аналитики, как подразделения организации, пользователи «1С:Бухгалтерия» регулярно сталкиваются со следующей ошибкой:
{ВнешняяОбработка.ПоискИЗаменаЗначений.Форма.Форма.Форма(249)}: Ошибка при вызове метода контекста (Найти) СтрокаТабЧасти = ТаблицаНабора.Найти(Ссылка, ИмяКолонки); по причине: Неверное имя колонки
В этой статье мы подробно разберем, почему возникает данная техническая проблема, проанализируем внутреннее устройство регистров бухгалтерии и рассмотрим практические способы решения этой ошибки — от программной доработки кода до использования современных штатных альтернатив.
Для того чтобы понять природу ошибки, давайте проанализируем, как устроена физическая структура таблиц в базах данных «1С:Бухгалтерия». В отличие от торговых или зарплатных конфигураций, где преобладают регистры накопления и регистры сведений, в бухгалтерских программах ключевую роль играет Регистр бухгалтерии (обычно это Хозрасчетный).
Измерения в регистре бухгалтерии могут обладать признаком балансовости:
Организация). Значения по таким измерениям фиксируются для проводки в целом. В физической таблице набора записей регистра они представлены одной стандартной колонкой.Подразделение или Валюта). Значения по ним могут различаться для дебета и кредита одной и той же проводки. В связи с этим платформа 1С автоматически разделяет такое измерение на две самостоятельные колонки в таблице набора записей: ИмяИзмеренияДт и ИмяИзмеренияКт (например, ПодразделениеДт и ПодразделениеКт).Универсальная обработка ПоискИЗаменаЗначений (особенно ее старые версии, изначально создававшиеся под конфигурации семейства «Управление торговлей») работает по упрощенному алгоритму обхода метаданных. Она получает имя измерения из конфигуратора — в нашем случае "Подразделение" — и пытается выполнить поиск этого имени напрямую в таблице записей регистра: ТаблицаНабора.Найти(Ссылка, "Подразделение"). Поскольку физически колонки с именем "Подразделение" в таблице набора записей регистра бухгалтерии не существует (а есть только "ПодразделениеДт" и "ПодразделениеКт"), платформа незамедлительно генерирует исключение «Неверное имя колонки».
Аналогичная проблема может возникать при попытке заменить субконто, так как они также хранятся в специализированных таблицах с именами колонок вида СубконтоДт1, СубконтоКт1 и так далее.
---
Если вам критически важно использовать именно вашу внешнюю обработку (например, в ней сохранены специфические настройки или она интегрирована в ваш бизнес-процесс), мы можем легко исправить этот недостаток в Конфигураторе. Давайте разберем по шагам, как локализовать и переписать проблемный участок кода.
Откроем внешнюю обработку в Конфигураторе и найдем строку, указанную в ошибке (в нашем примере это строка 249 модуля формы или модуля объекта). Как правило, этот фрагмент находится внутри общего цикла обхода наборов записей регистров в процедуре замены.
Вместо небезопасного прямого обращения по имени колонки нам необходимо внедрить проверку на существование колонки в таблице значений, а также предусмотреть раздельный поиск по дебету и кредиту для регистров бухгалтерии. Перепишем этот участок кода следующим образом:
// Получаем доступ к колонкам таблицы набора записей
КолонкиТаблицы = ТаблицаНабора.Колонки;
// Проверяем наличие прямой колонки (для балансовых измерений и обычных регистров)
Если КолонкиТаблицы.Найти(ИмяКолонки) <> Неопределено Тогда
СтрокаТабЧасти = ТаблицаНабора.Найти(Ссылка, ИмяКолонки);
Если СтрокаТабЧасти <> Неопределено Тогда
СтрокаТабЧасти[ИмяКолонки] = НоваяСсылка;
КонецЕсли;
Иначе
// Если прямая колонка не найдена, обрабатываем специфику регистра бухгалтерии (Дт / Кт)
ИмяКолонкиДт = ИмяКолонки + "Дт";
ИмяКолонкиКт = ИмяКолонки + "Кт";
// Проверяем и заменяем в Дебете
Если КолонкиТаблицы.Найти(ИмяКолонкиДт) <> Неопределено Тогда
Для Каждого СтрокаЗаписи Из ТаблицаНабора Цикл
Если СтрокаЗаписи[ИмяКолонкиДт] = Ссылка Тогда
СтрокаЗаписи[ИмяКолонкиДт] = НоваяСсылка;
КонецЕсли;
КонецЦикла;
КонецЕсли;
// Проверяем и заменяем в Кредите
Если КолонкиТаблицы.Найти(ИмяКолонкиКт) <> Неопределено Тогда
Для Каждого СтрокаЗаписи Из ТаблицаНабора Цикл
Если СтрокаЗаписи[ИмяКолонкиКт] = Ссылка Тогда
СтрокаЗаписи[ИмяКолонкиКт] = НоваяСсылка;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Что мы сделали в этом коде? Мы добавили безопасную проверку существования колонки с помощью метода Колонки.Найти(). Если колонка существует, система отрабатывает по стандартному быстрому алгоритму. Если же колонка отсутствует (как в случае с небалансовым измерением), программа конструирует имена колонок с суффиксами "Дт" и "Кт", осуществляет обход строк набора записей и производит корректную замену ссылок в обеих частях проводки.
---
Если вы работаете в современной конфигурации «1С:Бухгалтерия предприятия» редакции 3.0 на управляемых формах, вам совсем не обязательно прибегать к программированию и использованию устаревших внешних обработок. Платформа 1С и библиотека стандартных подсистем (БСП) уже содержат мощные, оптимизированные механизмы для поиска и замены дублирующихся ссылок.
Рассмотрим использование штатного инструмента «Поиск и удаление дублей»:
Подразделения.Этот встроенный инструмент разработан с учетом всех особенностей структуры метаданных регистров бухгалтерии. Платформа автоматически выполнит транзакционную замену ссылок во всех полях дебета, кредита, субконто и связанных документах, гарантируя целостность базы данных и отсутствие программных исключений.
---
Если специфика ваших задач требует использования именно интерфейса «Поиск и замена значений» (например, при сложной замене полей разных типов одновременно), рекомендуется обновить версию самой обработки.
На официальном диске ИТС (Информационно-технологического сопровождения 1С) или на специализированных порталах для разработчиков доступны обновленные универсальные обработки ПоискИЗаменаЗначений.epf, адаптированные под современные редакции конфигураций. В таких версиях разработчики вендора уже добавили блоки обхода исключений для регистров бухгалтерии, аналогичные описанному в Способе 1, а также реализовали поддержку работы с управляемыми формами и безопасным режимом выполнения на сервере.
Перед запуском любой обработки по массовой замене данных обязательно выполните создание резервной копии вашей информационной базы. Это убережет ваши данные от случайных ошибок при некорректно настроенных параметрах поиска!