При переходе с толстого клиента на тонкий клиент разработчики часто сталкиваются с ситуацией, когда привычный код добавления записей во внешние источники данных перестает работать и вызывает ошибку: «Процедура или метод не обнаружен (СоздатьОбъект)». Разберем по шагам, почему возникает эта ошибка и как правильно организовать программную запись во внешний источник данных в управляемом приложении.
Проанализируем контекст выполнения. Менеджеры внешних источников данных, а также коллекция ВнешниеИсточникиДанных не существуют на тонком клиенте. Они доступны только на стороне сервера, в толстом клиенте или во внешнем соединении.
Если код выполняется в форме управляемого приложения, обращение к таблице внешнего источника обязательно нужно выносить в серверную процедуру. Рассмотрим правильный пример организации вызова из модуля формы:
&НаКлиенте
Процедура ДобавитьЗапись()
ДобавитьЗаписьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ДобавитьЗаписьНаСервере()
Запись = ВнешниеИсточникиДанных.ТКС.Таблицы.ps_categories.СоздатьОбъект();
// Заполняем реквизиты объекта
Запись.Записать();
КонецПроцедуры
Выясним частую ошибку при структурировании кода. Если логика работы с внешним источником переносится в модуль объекта (например, в обработку или справочник), использование директив &НаКлиенте и &НаСервере недопустимо. Модуль объекта всегда компилируется целиком на сервере. Попытка прописать в нем директивы компиляции приводит к синтаксическим ошибкам и невозможности вызова процедур.
Если код выносится в общий модуль, проверим его свойства:
Экспорт.Рассмотрим подробнее поведение платформы при работе с таблицами внешних источников. Метод СоздатьОбъект() доступен исключительно для объектных таблиц (у которых в метаданных настроено ключевое поле и включено свойство ссылочности).
Если таблица в конфигураторе добавлена как необъектная, у ее менеджера физически отсутствует метод СоздатьОбъект(), из-за чего платформа выдает сообщение «Процедура или метод не обнаружен» даже при выполнении на сервере.
Для добавления данных в необъектные таблицы используем другие штатные инструменты менеджера таблицы:
&НаСервере
Процедура ДобавитьЗаписьВНеобъектнуюТаблицу()
МенеджерЗаписи = ВнешниеИсточникиДанных.ТКС.Таблицы.ps_categories.СоздатьМенеджерЗаписи();
// Заполняем ключевые поля и реквизиты
МенеджерЗаписи.Записать();
КонецПроцедуры
&НаСервере
Процедура ДобавитьНаборЗаписей()
НаборЗаписей = ВнешниеИсточникиДанных.ТКС.Таблицы.ps_categories.СоздатьНаборЗаписей();
// Устанавливаем отборы при необходимости
НоваяЗапись = НаборЗаписей.Добавить();
// Заполняем поля НоваяЗапись
НаборЗаписей.Записать();
КонецПроцедуры
Проанализируем системные требования платформы. Возможность программного изменения данных внешних источников появилась в платформе 1С:Предприятие 8.3.5. В более ранних версиях внешние таблицы были доступны исключительно для чтения.
Если используется современная версия платформы, но в свойствах конфигурации установлен Режим совместимости с версиями 8.3.4, 8.2 или ниже, функциональность записи во внешние источники блокируется платформой, и методы модификации данных становятся недоступными. Для исправления ситуации необходимо повысить режим совместимости конфигурации до актуального или отключить его.
Перенося код выполнения на сервер, учтем следующие технические нюансы:
УстановитьПараметрыСоединенияСеанса() и УстановитьСоединение().