Как добавить запись во внешний источник данных на тонком клиенте?

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

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

Причина 1. Попытка обращения к внешним источникам данных на стороне клиента

Проанализируем контекст выполнения. Менеджеры внешних источников данных, а также коллекция ВнешниеИсточникиДанных не существуют на тонком клиенте. Они доступны только на стороне сервера, в толстом клиенте или во внешнем соединении.

Если код выполняется в форме управляемого приложения, обращение к таблице внешнего источника обязательно нужно выносить в серверную процедуру. Рассмотрим правильный пример организации вызова из модуля формы:


&НаКлиенте
Процедура ДобавитьЗапись()
    ДобавитьЗаписьНаСервере();
КонецПроцедуры

&НаСервере
Процедура ДобавитьЗаписьНаСервере()
    Запись = ВнешниеИсточникиДанных.ТКС.Таблицы.ps_categories.СоздатьОбъект();
    // Заполняем реквизиты объекта
    Запись.Записать();
КонецПроцедуры

Причина 2. Ошибки контекста и директив компиляции в модулях

Выясним частую ошибку при структурировании кода. Если логика работы с внешним источником переносится в модуль объекта (например, в обработку или справочник), использование директив &НаКлиенте и &НаСервере недопустимо. Модуль объекта всегда компилируется целиком на сервере. Попытка прописать в нем директивы компиляции приводит к синтаксическим ошибкам и невозможности вызова процедур.

Если код выносится в общий модуль, проверим его свойства:

  1. Флажок Сервер должен быть обязательно установлен.
  2. Если процедура вызывается напрямую с тонкого клиента, у общего модуля должен стоять флажок Вызов сервера, а у самой процедуры должно присутствовать ключевое слово Экспорт.

Причина 3. Тип таблицы: объектная или необъектная

Рассмотрим подробнее поведение платформы при работе с таблицами внешних источников. Метод СоздатьОбъект() доступен исключительно для объектных таблиц (у которых в метаданных настроено ключевое поле и включено свойство ссылочности).

Если таблица в конфигураторе добавлена как необъектная, у ее менеджера физически отсутствует метод СоздатьОбъект(), из-за чего платформа выдает сообщение «Процедура или метод не обнаружен» даже при выполнении на сервере.

Для добавления данных в необъектные таблицы используем другие штатные инструменты менеджера таблицы:

  1. Через менеджер записи (для одиночной записи):

&НаСервере
Процедура ДобавитьЗаписьВНеобъектнуюТаблицу()
    МенеджерЗаписи = ВнешниеИсточникиДанных.ТКС.Таблицы.ps_categories.СоздатьМенеджерЗаписи();
    // Заполняем ключевые поля и реквизиты
    МенеджерЗаписи.Записать();
КонецПроцедуры
  1. Через набор записей (для массовой вставки данных):

&НаСервере
Процедура ДобавитьНаборЗаписей()
    НаборЗаписей = ВнешниеИсточникиДанных.ТКС.Таблицы.ps_categories.СоздатьНаборЗаписей();
    // Устанавливаем отборы при необходимости
    НоваяЗапись = НаборЗаписей.Добавить();
    // Заполняем поля НоваяЗапись
    НаборЗаписей.Записать();
КонецПроцедуры

Причина 4. Версия платформы и режим совместимости

Проанализируем системные требования платформы. Возможность программного изменения данных внешних источников появилась в платформе 1С:Предприятие 8.3.5. В более ранних версиях внешние таблицы были доступны исключительно для чтения.

Если используется современная версия платформы, но в свойствах конфигурации установлен Режим совместимости с версиями 8.3.4, 8.2 или ниже, функциональность записи во внешние источники блокируется платформой, и методы модификации данных становятся недоступными. Для исправления ситуации необходимо повысить режим совместимости конфигурации до актуального или отключить его.

Особенности настройки окружения на сервере 1С

Перенося код выполнения на сервер, учтем следующие технические нюансы:

  1. Разрядность ODBC-драйвера: на толстом клиенте соединение инициировалось клиентским приложением (чаще всего 32-битным). На сервере подключение выполняет служба кластера 1С. Если сервер 1С 64-разрядный, на сервере обязательно должен быть установлен 64-битный драйвер ODBC и настроен соответствующий системный DSN.
  2. Параметры сеанса: перед выполнением запросов или записи на сервере может потребоваться явная инициализация подключения текущего сеанса с помощью методов источника данных УстановитьПараметрыСоединенияСеанса() и УстановитьСоединение().
← На главную