При переходе с более старых версий конфигураций 1С, таких как 1С 7.7, на современные решения, например, 1С:Управление торговлей 11.5 (УТ 11.5), пользователи часто сталкиваются с изменениями в архитектуре данных. Одно из таких ключевых изменений — появление раздельных справочников "Партнеры" и "Контрагенты". В то время как в 1С 7.7 эти сущности были объединены, в УТ 11.5 они выполняют разные функции.
На практике это вызывает ряд вопросов: как организовать перенос, если нам не нужна сложная структура с партнерами, а достаточно привычного справочника контрагентов? Как правильно настроить систему, чтобы она работала максимально просто? Также при программной работе с данными, например, при загрузке банковских счетов контрагентов, возникают специфические ошибки, связанные с порядком записи объектов в базу данных.
В этой статье мы подробно разберем, как адаптировать перенос данных из 1С 7.7, чтобы эффективно работать только с контрагентами, а также как исправить распространенную ошибку при программном создании банковских счетов и их привязке к контрагентам.
Архитектура УТ 11.5 предусматривает разделение учета на управленческий и регламентированный, что и привело к появлению двух сущностей:
Партнеры мы можем управлять общими условиями работы, скидками, вести историю взаимодействий на уровне всей группы, контролировать запасы товаров, работать по своим видам цен и условиям оплаты.Контрагенты содержится официальная информация, необходимая для оформления первичных документов и сдачи отчетности.При переносе данных из 1С 7.7, где контрагент и его юридическое лицо были одной сущностью, возникает вопрос: как быть, если вам не требуется сложная структура Партнеры, а достаточно работать по старинке — только с контрагентами? Система 1С:УТ 11.5 по умолчанию предлагает гибкую настройку взаимодействия этих справочников, которая позволяет либо независимо вести партнеров и контрагентов (один партнер может иметь несколько контрагентов), либо связывать их в отношении 1:1, что по сути делает их единой сущностью для пользователя.
Для того чтобы система работала по принципу "один партнер — один контрагент", и пользователи видели только "клиентов" (которые фактически будут представлять собой контрагентов), вам необходимо отключить соответствующую функциональную опцию. Разберем по шагам, как это сделать:
Что это дает?
После отключения этой опции система УТ 11.5 будет автоматически создавать одного партнера для каждого нового контрагента, и наоборот. Для пользователей это будет выглядеть как единая сущность. В документах вы будете указывать "клиента" (по сути, партнера), а система сама будет подставлять соответствующего контрагента. Фактически, вы достигнете эффекта, когда для каждого контрагента будет создан свой партнер, но при этом для пользователя это будет прозрачно и не потребует постоянного переключения между справочниками.
При переносе данных из 1С 7.7 в этом режиме, информация о юридических лицах из 7.7 будет переноситься в справочник Контрагенты УТ 11.5, а система автоматически сформирует соответствующую запись в справочнике Партнеры, связывая их один к одному. Это значительно упрощает переход, если глубокое управленческое разделение партнеров и контрагентов вам не требуется.
Важно помнить, что в этом режиме все дополнительные реквизиты, которые вы бы обычно добавляли к справочнику Контрагенты, теперь следует добавлять к справочнику Партнеры, поскольку именно Партнеры становятся основной рабочей сущностью в документах и отчетах для пользователя.
Вторая часть вопроса касалась программного создания банковских счетов контрагентов и их корректной привязки. Автор столкнулся с ошибкой "поле контрагент не заполнено или заполнено не правильно" при попытке записать банковский счет. Давайте проанализируем исходный код и выясним причину ошибки.
Автор представил следующий фрагмент кода, который вызвал ошибку:
СК8 = Справочники.Контрагенты.СоздатьЭлемент();
... // Заполнение реквизитов контрагента (например, Наименование, ИНН, КПП)
ББанк = Справочники.КлассификаторБанков.НайтиПоКоду(БанкБик);
...
БКонтр = Справочники.БанковскиеСчетаКонтрагентов.СоздатьЭлемент();
БКонтр.БИКБанка = БанкБик;
БКонтр.Наименование = БанкСчет;
БКонтр.НомерСчета = БанкСчет;
БКонтр.ВалютаДенежныхСредств = Вал;
БКонтр.Банк = ББанк;
БКонтр.Владелец = СК8.ссылка; // Здесь проблема!
БКонтр.Записать();
//СК8.ОсновнойБанковскийСчет = БКонтр.ссылка; ??? поле ОсновнойБанковскийСчет был давно в бух, в ут 11.5 его нет
СК8.Записать();
Причина ошибки кроется в строке БКонтр.Владелец = СК8.ссылка;. Объект СК8 (элемент справочника Контрагенты) был создан с помощью метода СоздатьЭлемент(), но он еще не был записан в базу данных. До момента записи в базу данных, у нового элемента нет постоянной ссылки. Метод СоздатьЭлемент() возвращает объект типа "ЭлементСправочникаОбъект", а его свойство ссылка для незаписанного объекта является пустой ссылкой (Неопределено или ссылка на несуществующий объект).
Таким образом, когда мы пытаемся присвоить БКонтр.Владелец значение СК8.ссылка, фактически мы присваиваем пустую ссылку. Справочник БанковскиеСчетаКонтрагентов требует, чтобы его владелец (контрагент) был указан и существовал в базе данных, то есть имел непустую ссылку. Поэтому система выдает ошибку о незаполненном или неправильно заполненном поле "Владелец" (Контрагент) при попытке записать БКонтр.
Для корректной работы с программным созданием объектов, которые имеют ссылки друг на друга или на уже существующие объекты, необходимо соблюдать строгую последовательность записи в базу данных. Разберем по шагам, как это сделать правильно:
СК8 = Справочники.Контрагенты.СоздатьЭлемент();
СК8.Наименование = "МойКонтрагентООО";
СК8.ПолноеНаименование = "Общество с ограниченной ответственностью 'МойКонтрагент'";
СК8.ИНН = "1234567890";
СК8.КПП = "098765432";
// И другие реквизиты, необходимые для корректной записи контрагента
Записать() объект получает постоянную ссылку в базе данных, которую можно использовать для связи с другими объектами.
СК8.Записать(); // <-- Теперь СК8.ссылка будет содержать корректную ссылку на записанный контрагент
БКонтр = Справочники.БанковскиеСчетаКонтрагентов.СоздатьЭлемент();
// Предполагаем, что ББанк и Вал были получены ранее или созданы.
// Например, ББанк - ссылка на элемент справочника "КлассификаторБанков",
// Вал - ссылка на элемент справочника "Валюты".
БКонтр.БИКБанка = БанкБик; // Например, "044525225"
БКонтр.Наименование = "Расчетный счет " + БанкСчет; // Например, "Расчетный счет 40702810..."
БКонтр.НомерСчета = БанкСчет; // Например, "40702810000000000001"
БКонтр.ВалютаДенежныхСредств = Вал; // Ссылка на элемент справочника "Валюты"
БКонтр.Банк = ББанк; // Ссылка на элемент справочника "КлассификаторБанков"
БКонтр.Владелец = СК8.ссылка; // <-- Вот здесь мы используем ССЫЛКУ на УЖЕ ЗАПИСАННЫЙ контрагент
БКонтр.Записать(); // <-- БАНКОВСКИЙ СЧЕТ ЗАПИСАН
Таким образом, исправленный фрагмент кода будет выглядеть следующим образом:
// 1. Создаем и записываем контрагента
СК8 = Справочники.Контрагенты.СоздатьЭлемент();
// Заполняем необходимые реквизиты контрагента
СК8.Наименование = "Тестовый Контрагент ООО";
СК8.ПолноеНаименование = "Общество с ограниченной ответственностью 'Тестовый Контрагент'";
СК8.ИНН = "1234567890";
СК8.КПП = "012345678";
// Установите другие обязательные поля контрагента, например, ВидКонтрагента,
// и сведения о партнере, если опция "Независимо вести партнеров и контрагентов" включена.
// Если опция отключена, система сама создаст партнера.
СК8.Записать(); // <-- КОНТРАГЕНТ ЗАПИСАН, ТЕПЕРЬ ЕСТЬ ЕГО ССЫЛКА!
// 2. Получаем ссылки на банк и валюту
// (Предполагаем, что переменные БанкБик, БанкСчет, Вал уже заполнены из исходных данных)
Перем БанкБик, БанкСчет, Вал; // Объявляем переменные для примера
БанкБик = "044525225"; // Пример БИК
БанкСчет = "40702810000000000001"; // Пример номера счета
// Получаем ссылку на банк из классификатора
ББанк = Справочники.КлассификаторБанков.НайтиПоКоду(БанкБик);
Если ББанк = Неопределено Тогда
Сообщить("Банк с БИК " + БанкБик + " не найден в классификаторе!");
Возврат;
КонецЕсли;
// Получаем ссылку на валюту
Вал = Справочники.Валюты.НайтиПоНаименованию("руб."); // Или другим способом
Если Вал = Неопределено Тогда
Сообщить("Валюта 'руб.' не найдена!");
Возврат;
КонецЕсли;
// 3. Создаем и записываем банковский счет, используя ссылку на записанного контрагента
БКонтр = Справочники.БанковскиеСчетаКонтрагентов.СоздатьЭлемент();
БКонтр.БИКБанка = БанкБик;
БКонтр.Наименование = "Р/с " + БанкСчет;
БКонтр.НомерСчета = БанкСчет;
БКонтр.ВалютаДенежныхСредств = Вал;
БКонтр.Банк = ББанк;
БКонтр.Владелец = СК8.ссылка; // <-- Используем СК8.ссылка после СК8.Записать()
БКонтр.Записать(); // <-- БАНКОВСКИЙ СЧЕТ ЗАПИСАН
В этом примере мы сначала полностью формируем и записываем контрагента, получаем его постоянную ссылку, а затем используем эту ссылку для корректного связывания с банковским счетом. Такой подход гарантирует целостность данных и отсутствие ошибок при создании подчиненных объектов.
Автор также задал вопрос о поле ОсновнойБанковскийСчет, которое в старых версиях (например, в 1С:Бухгалтерия или УТ 10.3) могло присутствовать напрямую в карточке контрагента или организации. В УТ 11.5 по умолчанию такого прямого реквизита в справочнике Контрагенты или Организации нет.
Система УТ 11.5 позволяет работать с несколькими банковскими счетами для одного контрагента, и выбор основного счета для подстановки в документы обычно осуществляется на уровне настроек договора с контрагентом или путем интерактивного выбора в самом документе. Например, в документе Реализация товаров и услуг или Поступление товаров и услуг есть поле для выбора банковского счета контрагента, которое может заполняться автоматически в соответствии с настройками договора. Если вам все же требуется жестко привязанный "основной" банковский счет, который будет автоматически подставляться всегда, это может быть реализовано через дополнительные реквизиты для справочника Контрагенты или Партнеры (в зависимости от вашей настройки) с типом значения "СправочникСсылка.БанковскиеСчетаКонтрагентов", либо путем небольшой доработки конфигурации. Однако стандартный функционал УТ 11.5 предполагает более гибкий подход к выбору банковских счетов, который часто зависит от конкретного договора или вида расчетов.
В более сложных сценариях переноса данных или обмена, когда необходимо создать объект с заранее определенным уникальным идентификатором или избежать многократной записи связанных объектов (например, при циклической зависимости ссылок между объектами, когда объект А ссылается на Б, а Б ссылается на А), может быть использован метод УстановитьСсылкуНового(). Этот метод позволяет присвоить новому, еще не записанному объекту, заранее подготовленную ссылку (как правило, сгенерированную по уникальному идентификатору УникальныйИдентификатор). Это полезно, когда, например, контрагент и его основной договор должны ссылаться друг на друга, и вы хотите избежать двойной записи контрагента (первая запись для получения ссылки, вторая — для сохранения ссылки на договор).
Часто этот метод применяется в сочетании с установкой флага ОбменДанными.Загрузка = Истина, что отключает стандартные проверки и обработчики событий при загрузке данных, оптимизируя процесс и позволяя создавать объекты с заранее заданными ссылками. Однако для большинства типовых задач программного создания объектов, как в нашем случае, достаточно просто соблюдать порядок записи: сначала записываем владельца, чтобы получить его ссылку, а затем используем эту ссылку для подчиненных объектов.
Таким образом, мы рассмотрели два основных аспекта, которые могут вызвать сложности при переходе на УТ 11.5: управление связью "Партнеры-Контрагенты" и корректное программное создание связанных объектов, таких как банковские счета. Применяя эти рекомендации, вы сможете обеспечить более гладкий перенос данных и стабильную работу системы.