Запись во внешние источники данных в «1С:Предприятие 8»
(бесплатная статья по Программированию в 1С)

О чем эта статья

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

Применимость

В статье рассматривается платформа 1C 8.3.5. Материал актуален и для текущих релизов платформы.

Запись во внешние источники данных в «1С:Предприятие 8»

В платформе 8.2.14 в дерево метаданных был добавлен новый объект – внешние источники данных. Назначение этого механизма – получение данных из внешних баз по отношению к 1С.

С выходами новых релизов платформы внешние источники данных развивались, например, стало возможным помещение во временные таблицы, выполнение соединений с обычными таблицами.

В статье мы рассмотрим, какие инструменты есть у разработчика для осуществления записи во внешние источники данных.

Все действия выполнялись на СУБД Microsoft SQL Server 2008 R2.

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

Эта возможность позволяет запускать хранимые процедуры на стороне SQL Server, а при их помощи обращаться к данным внешних источников, в том числе и на запись.

Разберем пример. Создадим при помощи SQL Management Studio новую базу данных с именем kursy_test. Все дальнейшие эксперименты будут выполняться на ней.

В этой базе создадим таблицу nomenklatura, для этого напишем скрипт следующего содержания:

USE [kursy_test]
GO
CREATE TABLE [dbo].[nomenklatura](
[id] [int] NOT NULL,
[description] [nvarchar](150) NOT NULL,
[price] [numeric](15, 2) NULL,
CONSTRAINT [PK_id] PRIMARY KEY ([id])
)
GO

В результате выполнения будет создана таблица следующей структуры:

Таблица в базе данных

Теперь нам нужно создать две хранимые процедуры, с помощью которых и будет выполняться модификация данных.

Первую процедуру назовем insert_nomenklatura. Она будет предназначена для добавления новой строки в таблицу. Скрипт для ее создания будет выглядеть так:

USE [kursy_test]
GO
CREATE PROCEDURE insert_nomenklatura
@id int,
@description nvarchar(150),
@price numeric(15, 2)
AS
BEGIN
INSERT INTO [kursy_test].dbo.[nomenklatura] ([id], [description] ,[price])
VALUES (@id, @description, @price)
END
GO

Вторая процедура с именем update_nomenklatura будет выполнять обновление уже существующей в таблице записи. Чтобы ее создать, был запущен такой скрипт:

USE [kursy_test]
GO
CREATE PROCEDURE update_nomenklatura
@id int,
@description nvarchar(150),
@price numeric(15, 2)
AS
BEGIN
UPDATE [kursy_test].dbo.[nomenklatura]
SET [description]=@description,[price]=@price
WHERE [id]=@id
END
GO

В Обозревателе объектов созданная таблица и две хранимые процедуры выглядят следующим образом:

Обозреватель объектов

Все подготовительные действия на стороне Microsoft SQL Server мы выполнили, теперь переходим в конфигуратор “1С:Предприятие 8”.

Создаем новый внешний источник данных с именем Nomenklatura. При создании новой таблицы в этом источнике данных указываем следующие параметры подключения к источнику данных:

Подключение к источнику данных

Строку соединения укажем следующую:

Driver={SQL Server}; Server=(local); Database=kursy_test; User Id=sa; Password=;

При наличии пароля у пользователя sa его необходимо указать в параметре Password строки соединения.

Если все параметры подключения указаны корректно, при нажатии на кнопку ОК, откроется окно, содержащее таблицы, доступные в источнике данных:

Конструктор таблиц внешнего источника данных

Для увеличения нажмите на изображение.

Отмечаем галочками интересующие нас поля таблицы. При нажатии кнопки Готово во внешнем источнике данных Nomenklatura будет создана таблица dbo_nomenklatura:

Таблица во внешнем источнике данных

Теперь переключаемся на закладку “Функции” нашего источника данных.

При помощи аналогичного мастера производим добавление двух хранимых процедур:

Конструктор функций внешнего источника данных

Получаем следующий внешний вид закладки “Функции”:

Внешний источник данных - Функции

Теперь запрограммируем пользовательский интерфейс для работы с внешним источником данных.

В форме списка на командной панели расположим кнопку “Добавить” со следующим обработчиком:

&НаКлиенте
Процедура Добавить()
Оповещение = Новый ОписаниеОповещения(“ОткрытьТаблицуЗавершение”, ЭтотОбъект);
ОткрытьФорму(
“ВнешнийИсточникДанных.Nomenklatura.Таблица.dbo_nomenklatura.ФормаОбъекта”
, , , , , ,
Оповещение
, РежимОткрытияОкнаФормы.БлокироватьВесьИнтерфейс);
КонецПроцедуры

В форме объекта разместим кнопку “Сохранить”, при нажатии на которую выполняется следующий код:

&НаКлиенте
Процедура Сохранить(Команда)
СохранитьНаСервере();
КонецПроцедуры

&НаСервере
Процедура СохранитьНаСервере()
Если Объект.Ссылка.Пустая() Тогда
ВнешниеИсточникиДанных.Nomenklatura.dbo_insert_nomenklatura
(
Объект.id, Объект.description, Объект.price);
Иначе
ВнешниеИсточникиДанных.Nomenklatura.dbo_update_nomenklatura
(
Объект.id, Объект.description, Объект.price);
КонецЕсли;
КонецПроцедуры

В режиме предприятия форма списка выглядит следующим образом:

Форма списка

Форма объекта представлена ниже:

Форма объекта

Для увеличения нажмите на изображение.

После нажатия на кнопку “Сохранить” вызывается хранимая процедура на SQL Server, в таблицу базы данных будет добавлена новая запись.

Таким образом, при помощи хранимых процедур мы реализовали запись во внешние источники данных.

В платформе 8.3.5 появилась новая возможность – запись во внешние источники данных напрямую, минуя разобранный выше механизм хранимых процедур.

Данные можно редактировать как программно, так и интерактивно. И для нашего примера прибегать к конфигурированию не придется.

В командных панелях и в меню “Еще” можно увидеть стандартные кнопки, такие как “Создать”, “Скопировать”, “Изменить” и т.д.

Редактирование в пользовательском режиме

Редактирование в пользовательском режиме

Для увеличения нажмите на изображение.

А в форме объекта появились кнопки “Записать” и “Записать и закрыть”:

Как видно, теперь работа с внешними источниками похожа на работу со справочниками, документами и т.д.

Рассмотрим, какие изменения были произведены на уровне метаданных, чтобы сделать возможным запись во внешние источники данных.

У таблицы данных добавлено новое свойство ТолькоЧтение (тип – булево).

Если это свойство установлено в Истина, запись данных в эту таблицу средствами платформы невозможна.

Поле таблицы данных обладает теперь свойствами:

  • ТолькоЧтение (тип – булево) – возможно ли изменение данных в этом поле;
  • РазрешитьNull (тип – булево) – возможно ли в данном поле сохранять значение NULL.

Свойства таблицы данных

Свойство Только чтение следует устанавливать в значение Истина для полей базы данных с автоматическим изменением, автоматически формируемые ключевые поля, вычисляемых полей и т. д.

Добавлять, изменять и удалять данные во внешних источниках можно с помощью встроенного языка.

Для этого у объектов ВнешнийИсточникДанныхТаблицаНаборЗаписей и ВнешнийИсточникДанныхТаблицаОбъект были реализованы новые методы Записать() и Удалить().

Рассмотрим пример программного добавления новой записи для внешнего источника данных, рассмотренного выше.

&НаКлиенте
Процедура СоздатьПрограммно(Команда)
СоздатьПрограммноНаСервере();
КонецПроцедуры

&НаСервере

Процедура СоздатьПрограммноНаСервере()
ЗаписываемыйОбъект =
ВнешниеИсточникиДанных.Nomenklatura.Таблицы.dbo_nomenklatura.СоздатьОбъект();
ЗаписываемыйОбъект.id = 5;
ЗаписываемыйОбъект.description = “Шкаф”;
ЗаписываемыйОбъект.price = 5000;
ЗаписываемыйОбъект.Записать();
КонецПроцедуры

В модуле объекта таблицы внешнего источника данных теперь можно задать обработчики событий, возникающих при записи, такие как ПередЗаписью(), ПриЗаписи() и т. д.:

Обработчики событий

В данной статье были рассмотрены два варианта записи данных во внешние источники данных – при помощи хранимых процедур и при помощи новых механизмов платформы 8.3.5.

Таким образом, в платформе теперь реализованы механизмы для полноценной интеграции с внешними приложениями.

В редакции 8.3.6 описываемый выше функционал был расширен при помощи новых специальных методов ПолучитьИзменяемыеПоля() и УстановитьИзменяемыеПоля(). С помощью них предоставлена возможность выполнять операцию записи в те поля таблицы ВИД, которые помечены в конфигураторе как доступные только для чтения. Благодаря этому стало возможным реализовать такой сценарий, при которой запись в отдельные поля таблицы ВИД возможна только в тех случаях, когда это необходимо в соответствии с бизнес-логикой приложения.

В редакции 8.3.7 был доработан механизм, определяющий какие конкретно поля таблиц ВИД могут содержать значения NULL. До этого момента все таблиц ВИД могли принимать это значения. Такое изменение связано с увеличением скорости сортировки в динамических списках по этим полям.

В редакции 8.3.8, наконец, стало возможным определение того факта, что внешний источник данных находится в состоянии транзакции. Эта функциональность представлена новым методом ВнешнийИсточникДанныхМенеджер.ТранзакцияАктивна()

В заключении отметим, что для внешних источников данных, как было показано выше, описываются таблицы данных из классической реляционной модели. Платформа же использует иную парадигму работу с данными, предлагая разработчику некоторый набор типов прикладных объектов (справочники, документы, регистры и т.д.). Именно поэтому система при работе с таблицами внешних источников данных не поддерживает большую часть функциональности, которая присуща ее “родным” объектам. Поэтому рекомендуется воздержаться от разработки какой-то бизнес-логики, с учетом использования таблиц ВИД, если это не связано с задачами интеграции с уже существующими системами. Или, говоря по простому, нужно стараться избегать хранить данные, которые активно используются в вашем приложении, в какой-то другой таблице внешней системы, если они этой системой не используются.

В следующей статье мы рассмотрим логическое продолжение использования технологии внешних источников данных в системе «1С:Предприятие».

PDF-версия статьи для участников группы ВКонтакте

Мы ведем группу ВКонтакте – http://vk.com/kursypo1c.

Если Вы еще не вступили в группу – сделайте это сейчас и в блоке ниже (на этой странице) появятся ссылка на скачивание материалов.

Статья по программированию - в PDF-формате

Статья в PDF-формате

Вы можете скачать эту статью в формате PDF по следующей ссылке: Ссылка доступна для зарегистрированных пользователей)

Если Вы уже участник группы – нужно просто повторно авторизоваться в ВКонтакте, чтобы скрипт Вас узнал. В случае проблем решение стандартное: очистить кеш браузера или подписаться через другой браузер.

177 комментариев для “Запись во внешние источники данных в «1С:Предприятие 8»
(бесплатная статья по Программированию в 1С)

  1. Schanya сказал:

    Добрый день!
    Столкнулся с проблемой записи во Внешний источник данных (база SQL). 1С “вываливается” с ошибкой: Ошибка SDBL: в схеме баз данных нет таблицы с именем EDBT35556
    Случилось всё после обновления платформы 8.3.12.1714. Какие могут быть решения проблемы?

    • Василий Ханевич сказал:

      Добрый день!
      Есть похожая ошибка платформы.
      https://bugboard.v8.1c.ru
      Код ошибки: 10197269
      Исправлена: “Технологическая платформа”, версия 8.3.12.1773 (для тестирования)
      Попробуйте проверить.

      • Schanya сказал:

        Спасибо за ответ! Описание ошибки от 1С уже видел, но обновление платформы аж до 8.3.13.1513 результата не дало. Решение – удалить одну из таблиц (в моём случае) источника данных и потом добавить её же. Происходит реструктуризация данных и после нее запись в “ВИД” заработала.

        • Василий Ханевич сказал:

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

  2. NataliSlukhay сказал:

    Добрый день. Что то по всему интернету все примеры без использования реквизитов с типом Дата! При получении данных из другой базы 1с, подобный реквизит прилетит в текущую базу с плюсом 2000 лет. К примеру 2018 год прилетит как 4018. Затем при попытке записать некий объект с подобным реквизитом, уже 1с-ка обругается что год не может быть больше 3999. Если же уменьшить этот реквизит до 2018 года (в таблице внешнего источника данных), то он в SQL запишется как 0018 год. Кто-нибудь решал подобную проблему? Спасибо.

    • Василий Ханевич сказал:

      Добрый день!
      С подобной проблемой не сталкивался.
      Рекомендую обратиться к разработчикам платформы с вопросом, как записать подобную дату во внешний источник.

  3. anat сказал:

    Здравствуйте.
    Есть 2 клиент-серверные БД (обе созданы со смещение дат = 2000).
    Из одной получаем данные через Внешние источники.
    Когда тип данных Дата, то при получении выходит дата, больше на 2000 лет .
    Например, год рождения в справочнике Контрагенты в источнике 12.04.1964, а во второй базе видим уже 12.04.3964.

    Как решается такая ситуация?

    PS. На сайте ИТС написано:
    “Если смещение дат установлено в 2000, то при записи в базу данных к дате будет прибавлено 2000 лет, а при чтении из базы данных – вычтено 2000 лет. Это позволит записывать в базу данных любые даты 1С:Предприятия.”

    Т.е. причина-то понятна: мы, напрямую обращаясь через внешние источники данных к таблицам БД , получаем то, что там и записано по-факту.

    Но почему внешние источники данных, при чтении из таблицы (SQL) не вычитают 2000?

    • Василий Ханевич сказал:

      Добрый день!
      В интернете встречал упоминание такой проблемы. При обработке таких данных в 1С нужно вручную в запросах учитывать смещение дат.
      Не нашел информацию, почему разработчики платформы остановились на этом варианте при работе с внешними источниками данных. Возможно, чтобы сохранить универсальность – какие данные в таблицах БД есть, такие и выводить. Т.к. смещение дат характерно только для MS SQL Server, а при помощи внешних источников можно работать с различными СУБД.

      • Геннадий сказал:

        При запросах это можно. А вот если необходимо наоборот записать в базу источник изменения, то требуется прибавить 2000 к году даты. И тут самое интересное, уже 1С ругается что дата не может быть больше 3999 года

        • Василий Ханевич сказал:

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

  4. asashanis сказал:

    Добрый день! У меня на платформе 8.3.10.2667 выдается такая ошибка, при этом на платформе 8.3.6 такой ошибки нет не могу понять в чем дело {ВнешняяОбработка.ДанныеВБазу.МодульОбъекта(489)}: Ошибка при вызове метода контекста (Записать)
    ЧленСРО.Записать();
    по причине:
    Ошибка внешней базы данных:
    ошибка при выполнении запроса
    по причине:
    Ошибка ODBC. SQLSTATE: HYC00
    Номер ошибки: 106
    Описание: [Microsoft][Драйвер ODBC Microsoft Access]Дополнительная функция не реализована

    • Василий Ханевич сказал:

      Добрый день!
      С такой ошибкой не встречался.
      Возможно, проблема в разной разрядности 1С и драйверов ODBC (32- и 64-битные), попробовать 32-битную платформу, ведь клиентские приложения 8.3.6 были только 32-битными.
      Возможно, разные платформы формируют отличающиеся запросы, поэтому и возникает ошибка. Попробовать использовать платформу поновее.
      Еще можно попробовать изменить строку подключения к базе, попробовать использовать другой провайдер.

      • asashanis сказал:

        Ощущение что что-то где-то не донастроил, поставил новую платформу (32 разрядная), может какие-то параметры надо еще сделать, сомнения в том что на старой платформе работает на новой нет.. Еще удалось выяснить что при попытке принудительного начала транзакции выходит такая же ошибка (База.НачатьТранзакцию();)

        • Василий Ханевич сказал:

          Если на старой версии платформы всё работает корректно, а на новой платформе в этой же базе возникают ошибки, то это может быть ошибка платформы.
          Каких-то дополнительных настроек для работы с внешними источниками делать не нужно. Необходимо установить ODBC-драйвера, указать строку подключения к источнику данных.
          Попробовать создать новую базу данных во внешней СУБД, подключиться из 1С к этой базе.
          Еще на копии базы можно изменять режим совместимости и пробовать подключаться к внешней таблице. Возможно, при работе в каком-либо режиме совместимости все будет в порядке, а при переходе на следующий появится ошибка. Значит, изменения в платформе приводят к таким ошибкам.
          Есть смысл написать разработчикам платформы, описать проблему, отправить пример воспроизведения.

  5. Gosha сказал:

    Добрый день! не могу понять в чем дело. Например:
    1. Контрагент : id,name, …
    2. Договор: id,name,idContragent …
    где idContragent – ссылка на контрагента, но в 1С это пустая ссылка

    • Василий Ханевич сказал:

      Добрый день!
      Затрудняюсь Вам ответить.
      Возможно, для корректной записи во внешнюю базу нужно указывать id контрагента, а не его ссылку.

      • Gosha сказал:

        Добрый день! Я имел ввиду именно при чтении данных из sql. И ссылочный тип ВнешниеИсточникиДанных.Test.Таблицы.Контрагент.idContragent – пустая ссылка. если это поле в заполнить последствии заполнить, запись происходит без ошибок.

        • Василий Ханевич сказал:

          Добрый день!
          Возможно, для поля idContragent нужно указать ссылочный тип (вроде ВнешнийИсточникДанныхТаблицаСсылка.ВнешнийИсточникДанных1.Таблица1), т.е. ссылку на другую таблицу внешнего источника. Проверьте, что тип данных таблицы – объектные данные.
          По-хорошему нужно написать на v8@1c.ru с подробным описанием. Возможно, это ошибка платформы.

          • Gosha сказал:

            Добрый день, Василий! Оба объекта имеют тип “Объектные данные”. Поле на форме действительно

            ВнешнийИсточникДанныхТаблицаСсылка.Test.idContragent

            .
            При чем если в динамическом списке (фромыСписка) обратиться через точку

            Список.idContragent.Name

            то поле в списке заполнится.
            Но в формеОбъекта показывает, что это как будто не ссылочный тип.
            И еще если в таблице этому типу назначить тип ГУИД, то в дальнейшем можно будет обращаться через

            ВнешниеИсточникиДанных.Test.Таблицы.Contragent.ПолучитьСсылку(Объект.idContragent)

            но это, я думаю, жирный костыль.

            • Василий Ханевич сказал:

              Добрый день!
              Использую MS SQL Server. Создаю две таблицы:

              CREATE TABLE [dbo].[Contr](
                  [id] [nchar](10) NOT NULL,
                  [name] [nchar](10) NULL
              )

              CREATE TABLE [dbo].[Dogovor](
                  [id] [nchar](10) NOT NULL,
                  [name] [nchar](10) NOT NULL,
                  [idcontr] [nchar](10) NOT NULL
              )

              Загружаю эти таблицы в 1С как таблицы внешнего источника данных.
              Для поля idcontr таблицы Dogovor указываю тип ВнешнийИсточникДанныхТаблицаСсылка.ВнешнийИсточникДанных1.dbo_Contr
              Поле ключа указываю id, поле представления – name
              Больше никаких действий не делаю, формы будут генерироваться платформой автоматически. В пользовательском режиме поле idcontr таблицы Dogovor отображается именно как ссылка – доступен выбор из списка:
              Внешний источник
              Попробуйте у себя такой же тестовый пример воспроизвести, может получится найти разницу.

              • Gosha сказал:

                Добрый день, Василий! Да действительно, такое поведение возникает если в качестве ключа использовать тип “uniqueidentifier”, а если обычный “int”, то все ОК!

  6. 1A сказал:

    Добрый день! Могли бы вы дать пример использования внешнего источника MS SQL Server, а именно получение от Stored Procedure таблицы данных из двух-трех колонок. Не могу найти подробное описание, везде написано поверхностно. Получаю ошибку 4104. Заранее спасибо.

    • Василий Ханевич сказал:

      Добрый день!
      Готового примера сейчас в наличии нет.
      Я бы смотрел в сторону использования COM-объекта ADODB, т.е. из 1С подключиться к MS SQL, чтобы выбрать данные из базы.

      • 1A сказал:

        У нас уже сделано внешний источник с хранимой процедурой, все работает. Только хотелось бы получать ответ от процедуры. Как это сделать именно от процедуры – получить recordset – не понятно и нигде толком не описано.

        • Василий Ханевич сказал:

          Попробуйте создать таблицу внешнего источника данных, на вкладке Данные выбрать Вид таблицыВыражение. В поле Выражение в источнике данных указать вызов вашей функции. Кроме этого нужно создать поля таблицы (это будут колонки, которые возвращает функция).
          Попробуйте воспользоваться конструктором таблиц, чтобы не вводить все колонки вручную, платформа должна определить функцию в источнике данных, предложить выбрать ее в 1С.

          Подробнее можно посмотреть в документации на ИТС – Таблица внешнего источника данных

          • inkn сказал:

            Добрый день.
            А можно этот момент (с возвратом значения в т-цу из ф-ции) немного подробнее?
            Т.е. если мне нужно получить один параметр из внешней процедуры:
            – добавляю из внешнего источника процедуру с входящими параметрами (передаю их из 1С в SQL), например T_test;1(&1, &2, &3);
            – создаю вручную в конф.1С внешнюю т-цу Tab_rez с 1 полем например Rez (число 2,0);
            – выбираю Вид таблицы = Выражение и заполняю его “dbo.T_test;1(&1, &2, &3)”;
            А что и как теперь вызвать, чтобы передать в “dbo.T_test” 3 параметра и получить ответ “Tab_rez”?

            В случае просто вызова процедуры пишу:
            “ВнешниеИсточникиДанных.WMS.T_test(парам1, парам2, парам3);” – но, понятно, что результата не получу.
            В варианте:
            Рез = “ВнешниеИсточникиДанных.WMS.T_test(парам1, парам2, парам3);” – получаю ошибку:
            “Ошибка ODBC. SQLSTATE: 42000
            Номер ошибки: 102
            Описание: [Microsoft][ODBC SQL Server Driver][SQL Server]Неправильный синтаксис около конструкции “;”.

            А как через таблицу?

            И вопрос 2:
            может лучше использовать COMОбъект?

            Command = Новый COMОбъект(“ADODB.Command”);
            RecordSet = Новый COMОбъект(“ADODB.RecordSet”);
            Command.ActiveConnection = Connection;
            Command.CommandText = ТекстЗапроса;
            RecordSet = Command.Execute();
            Возврат RecordSet;
            где
            ТекстЗапроса = “EXEC auto_Name_Import @test_p1 = ” + ОписаниеСтроки.test_p1 + “,@test_p2 = NULL”;

            • Василий Ханевич сказал:

              Добрый день!
              В MS SQL создал функцию, возвращающей табличные данные:

              CREATE FUNCTION select_nom
              (  
                  @id int
              )
              RETURNS TABLE
              AS
              RETURN
              (
                  SELECT [id],[description],[price] FROM [kursy].dbo.[nomenklatura]  WHERE [id]=@id
              )
              GO

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

              dbo.select_nom(&1)

              Для получения данных в коде использую запрос:

              &НаСервере
              Процедура ВыбратьДанныеНаСервере()
                 
                  Запрос = Новый Запрос;
                  Запрос.Текст =
                      "ВЫБРАТЬ
                      |   select_nom.id КАК id,
                      |   select_nom.description КАК description,
                      |   select_nom.price КАК price
                      |ИЗ
                      |   ВнешнийИсточникДанных.ВнешнийИсточникДанных1.Таблица.select_nom(&id) КАК select_nom";
                 
                  Запрос.УстановитьПараметр("id", 1);
                 
                  ТЗ = Запрос.Выполнить().Выгрузить();

              КонецПроцедуры

              Вот такой вариант корректно работает.
              Через ADODB тоже можно попробовать, должно выполниться.

  7. 1A сказал:

    Подскажите, пожалуйста, как можно сделать задержку выполнения процедуры? Она длиться несколько секунд, без параметров и без получения каких либо данных, 1с ее обрывает быстрей чем нужно. Спасибо.

    • Василий Ханевич сказал:

      Добрый день!
      Например, вот таким образом:

      ПодключитьОбработчикОжидания("ИмяПодключаемойПроцедуры", 0.1, Истина)
  8. Brinex сказал:

    Добрый день!

    Подскажите пожалуйста есть ли возможность (или появилась в последних релизах платформы) записать в таблицу внешнего источника сразу весь набор записей, а не рекурсивно построчно?

    • Василий Ханевич сказал:

      Добрый день!
      У объекта типа ВнешнийИсточникДанныхТаблицаМенеджер есть метод СоздатьНаборЗаписей(), затем полученный набор можно записать в базу.

  9. Denis_Denis сказал:

    Добрый день!
    Возникла задача с записью данных из 1с в MySQL.
    Решил реализовать через внешний источник данных.

    Не подскажите,
    Когда я вызываю “Форму объекта” записи.
    Ввожу данные и нажимаю “Записать и закрыть”.

    Откуда платформа берет данные о пароле и пользователе и строке соединения, нет ли необходимости предварительно установить соединение с таблицей внешнего источника данных, перед редактированием объекта?

    P/S/ У меня возникает ошибка, с драйвером, хотя в конфигураторе таблицу я добавил с этим проблем не возникла.

    А кусок кода:
    ОткрытьФорму(“ВнешнийИсточникДанных.Data1C.Таблица.Customers.ФормаОбъекта”);
    С последующим нажатием записать и закрыть, ругается)

    • Denis_Denis сказал:

      Хочу добавить, причем если подключаться через:
      Connection = New COMObject(“ADODB.Connection”);
      Command = New COMObject(“ADODB.Command”);

      Connection.Open(“DRIVER={MySQL ODBC 5.3 Unicode Driver};SERVER=” + СокрЛП(Сервер) + “;UID=” + СокрЛП(Пользователь) + “;PWD=” + СокрЛП(Пароль) + “;DATABASE=” + СокрЛП(ИмяБазыДанных) + “;Connect Timeout=” + ТаймАут + “;”);
      Command.CommandTimeout = ТаймАут;

      Command.ActiveConnection = Connection;
      Command.CommandText = SQLЗапросВыгрузки;
      Command.Execute();

      Connection.Close();

      И задать соответсвующий запрос в переменную в строке
      Command.CommandText = SQLЗапросВыгрузки;
      То все отлично работает.

      ФормаОбъекта, внешнего источника данных откуда строку соединения вытаскивает…
      пытался перед открытием формы установить соединение по строке все проходит нормально, но не записывает…

    • Василий Ханевич сказал:

      Добрый день!
      Для редактирования параметров соединения нужно обратиться в пользовательском режиме к меню Все функции – Стандартные – Управление внешними источниками данных.

  10. Plu сказал:

    Здравствуйте
    на серверной базе подключила источник, при открытии любой его таблицы, также как и при выполнении запроса к источнику из консоли выходит ошибка: Разрешение SHOWPLAN запрещено в базе данных
    в чем дело может быть?
    для работы с внешними источниками необходимо это разрешение?

    • Василий Ханевич сказал:

      Добрый день!
      В интернете нашел такое решение – сделайте учетную запись в MS SQL, от имени которой работает сервер “1С:Предприятие”, с полными правами на нужную базу данных (например, назначить роль db_owner).

    • tim сказал:

      Столкнулись с такой же ошибкой. При первом выполнении запроса чтения – отрабатывает нормально. При последующих – выдает ошибку с SHOWPLAN.

      Проблема может быть еще в том числе и в правах пользователя, от которого выполняется запрос, на базу tempdb

  11. Хельга сказал:

    Здравствуйте!
    Строка подключения:
    Driver = {Microsoft Access Driver (*.mdb, *.accdb)};
    DBQ=\\ves\Vesy\data.mdb;

    На локальной базе подключается к источникам.
    А на серверной не может.
    Пробовала с драйвером и 64х и 32х разрядными версиями.
    Все равно пишет:
    ОШИБКА [IM002] [Microsoft] [ODBC Driver Manager] Источник данных не найден и не указан драйвер по умолчанию.

    В чем может быть причина?

    • Василий Ханевич сказал:

      Добрый день!
      Первым делом проверьте, от имени какого пользователя запускается сервер “1С:Предприятие”. Возможно, у этого пользователя нет прав на работу с сетевым ресурсом.

        • Василий Ханевич сказал:

          Добрый день!
          А если в строке подключения указывать не сетевой, а локальный путь к файлу? И разместить mdb-файл на том же компьютере, где работает сервер “1С:Предприятие”.
          Также дело может быть в разрядности (32- и 64-битный) сервера “1С:Предприятие” и ODBC-драйверов.

          • Хельга сказал:

            Добрый день!
            К локальному тоже не получается.
            Ругается что не может подключится к драйверу.
            Как и писала выше пробую и 32- и 64-битную разрядность.
            Ошибка все равно есть.

                • Василий Ханевич сказал:

                  Добрый день!
                  Еще как вариант – проверить имя источника данных (Microsoft Access Driver (*.mdb, *.accdb)) на компьютере, где установлен сервер “1С:Предприятие”. В панели управления: пункт Администрирование – Источники данных ODBC. Может, там что-нибудь на мысль наведет.

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

  12. Алина Губенко сказал:

    Добрый день! Подскажите, пожалуйста, подключаюсь к внешнему источнику данных с одного и того же компьютера из разных баз 1С. Строка подключения:
    DRIVER={SQL Server}; SERVER=zakupki; UID=LEMZ\agubenko; PWD=123ASDasd; DATABASE=BVK; LANGUAGE=русский

    В локальной файловой базе подключается без проблем, в серверной базе данных выдает сообщение “Ошибка аутентификации клиента средствами операционной системы”. Все происходит в одно и то же время, с чем может быть связана ошибка?

    • Василий Ханевич сказал:

      Добрый день!
      Предполагаю, что у пользователя, от имени которого работает сервер “1С:Предприятие”, нет прав на подключение к SQL-серверу. Именно в этом направлении я бы искал решение.

  13. Андрей Викторович сказал:

    Добрый день!
    Споткнулся на ошибке, при попытке записи в необъектную таблицу на sql 2014 из 1С (платформа 8.3.6.2299).
    ЗаписываемыйОбъект = ВнешниеИсточникиДанных.Мой.Таблицы.CARS.СоздатьМенеджерЗаписи();
    ЗаписываемыйОбъект.NOMER = Автомобиль.ГосНомер;
    ЗаписываемыйОбъект.Записать();
    Ошибка при вызове метода контекста (Записать)
    ЗаписываемыйОбъект.Записать();

    по причине:
    Ошибка внешней базы данных:
    ошибка при выполнении запроса
    по причине:
    Ошибка ODBC. SQLSTATE: 42000
    Номер ошибки: 102
    Описание: [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near ‘<'.
    В чем может быть моя ошибка?

    • Василий Ханевич сказал:

      Добрый день!
      В платформе 8.3.6 регистрировалось несколько ошибок, связанных с внешними источниками данных. В одной из них упоминались как раз необъектные таблицы внешних источников данных. Ошибки должны быть исправлены в 8.3.7. Попробуйте на новой версии платформы.
      Также есть комментарий участника с подобной проблемой.
      Еще как вариант попробуйте использовать метод СоздатьНаборЗаписей().

  14. mikhail1303 сказал:

    А можно как то создать Внешний источник данных без конфигурирования.
    Не хочется трогать конфигурацию, а все нужно сделать с помощью внешней обработки?

    • Василий Ханевич сказал:

      Добрый день!
      Нет, это объект метаданных. Поэтому создать его можно только в конфигураторе.

  15. Алексей сказал:

    Публикация хорошая и нужная. Посмотрел, на сайте имеются и другие хорошие статьи. Большое спасибо!

  16. media сказал:

    Еще вопрос.
    Можно ли средствами 1С определить, проводятся ли с таблицей MS SQL какие либо действия или она не изменяется. Скажем так, база чужая и я не могу в момент обращения её заблокировать. Я обращаюсь к таблице в момент когда она ещё заполняется другой программой. Тоесть у меня нет уверенности, что я загрузил всю информацию а не локальный срез в момент времени.

    • Василий Ханевич сказал:

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

  17. media сказал:

    Если колонок много, а строк очень много. Придется описывать все поля и ждать пока отработает цикл. Меня больше устроит вариант:

    ТЗ = Новый ТаблицаЗначений;
    ВнешнийИсточникДанныхТаблицаНаборЗаписей = ВнешниеИсточникиДанных.Nomen.Таблицы.dbo_nomenklatura.СоздатьНаборЗаписей();
    ВнешнийИсточникДанныхТаблицаНаборЗаписей.Прочитать();
    ТЗ = ВнешнийИсточникДанныхТаблицаНаборЗаписей.Выгрузить();

    Работает очень быстро, но с той ошибкой.

    • Василий Ханевич сказал:

      Да, меня по скорости тоже устроил бы такой вариант, но в этом случае не сохраняется NULL, приходится придумывать обходной вариант.

  18. media сказал:

    Если выгружать данные из внешнего источника данных (MS SQL) используя метод выгрузить(), как в примере, происходит преобразование значения NULL в числовой 0. Как получить NULL.

    ВнешнийИсточникДанныхТаблицаНаборЗаписей.ИмяВнешнегоИсточника.ИмяТаблицыВнешнегоИсточникаДанных.Выгрузить()

    • Василий Ханевич сказал:

      Добрый день!
      Например, при помощи явной типизации колонок таблицы значений:

      ТЗ = Новый ТаблицаЗначений;
      ТЗ.Колонки.Добавить("id",      Новый ОписаниеТипов("Число"));
      ТЗ.Колонки.Добавить("description", Новый ОписаниеТипов("Строка"));
      ТЗ.Колонки.Добавить("price",       Новый ОписаниеТипов("Число, NULL"));
      ВнешнийИсточникДанныхТаблицаНаборЗаписей = ВнешниеИсточникиДанных.Nomen.Таблицы.dbo_nomenklatura.СоздатьНаборЗаписей();
      ВнешнийИсточникДанныхТаблицаНаборЗаписей.Прочитать();
      Для каждого ЭлементДанных Из ВнешнийИсточникДанныхТаблицаНаборЗаписей Цикл
          НоваяСтрока = ТЗ.Добавить();
          ЗаполнитьЗначенияСвойств(НоваяСтрока, ЭлементДанных);
      КонецЦикла;
  19. Елена сказал:

    Подскажите, как записать в базу картинку через внешний источник данных.

    • Василий Ханевич сказал:

      Добрый день!
      Если картинку нужно сохранить непосредственно в базу 1С, то в таком случае не нужен внешний источник данных.
      Если нужно поместить изображение в стороннюю базу, расположенную на сервере СУБД, то можно воспользоваться примером из статьи:

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

      Здесь необходимо определенному полю в таблице присвоить данные картинки в определенном формате, т.е. так, как этого требует эта внешняя база, внешнее приложение. Возможно, поторебуется какая-то конвертация, преобразование.
      Для работы с картинками в 1С можно использовать объекты ДвоичныеДанные и ХранилищеЗначения:

      ВнешнийФайл = Новый ДвоичныеДанные(ПолноеИмяФайла);
      Хранилище   = Новый ХранилищеЗначения(ВнешнийФайл);
      • Елена сказал:

        Уточню вопрос – Записать нужно в таблицу MsSQL через внешний источник данных. Тип поля задали VarBinary, присваиваем значение картинки в формате ДвоичныеДанные, а запись в базу данных не происходит. В чем наша ошибка?

        • Василий Ханевич сказал:

          Проверил на тестовом примере. При записи в MS SQL в колонку с двоичными данными всегда попадает значение NULL. Похоже на ошибку платформы. Задал вопрос разработчикам.

          • Василий Ханевич сказал:

            Обратился к разработчикам. Зарегистрировали ошибку, планируют исправить в будущих версиях платформы.

            • Илья сказал:

              Похожая проблема. Но… Значения NULL вместо двоичного кода не получал. Либо ошибку SDBL либо Двоичный код. Я могу записать картинку png размером 1кб через функцию ВИД, передавая в качестве картинки код “ФайлНашейКартинки = Новый ДвоичныеДанные(“C:\temp\25.png”);”. Но если так передавать картинку размером 400кб, то выдаётся ошибка “Ошибка SDBL:Не найдено значение параметра Pa9ebebc1e949ce4aa32674a5de54d24b.”. Соответственно при разных картинках, параметр меняется. Такое ощущение что передаче двоичного кода в параметр, где то закрадывается запятая, после которой машина думает что пошёл новый параметр. Просматривал картинки через WinHex – заявленных в ошибке SDBL строк не нашёл. Откуда всплывают эти Pa9e… не понятно.

              • Василий Ханевич сказал:

                Добрый день!
                Похоже на еще одну ошибку платформы. Также сказали, что моя ошибка связана с необъектными таблицами внешних источников данных. У меня просили проверить на 8.3.7, там исправляли ошибки, связанные с внешними источниками данных. Если у вас и на 8.3.7 воспроизводится, то надо обращаться к разработчикам платформы.

                • Семен сказал:

                  Добрый день! Аналогичная ситуация, Платформа 8.3.10.2505 – не вставляется значение типа 1с Двичные данные в тип varbinary SQL, выходит аналогичная ошибка

                  • Василий Ханевич сказал:

                    Добрый день!
                    На сервисе публикации ошибок нашел вот такую:
                    https://bugboard.v8.1c.ru/error/000012013.html
                    Отмечена как исправленная в 8.3.8.1652

                    Если ошибка воспроизводится, то нужно сообщать разработчикам.

                  • Игорь сказал:

                    Измените строку подключения на “Driver={SQL Server Native Client 11.0};Server=ххххх;Database=ххх;”. С такой строкой (разумеется хх замените на свои) записывает без ошибок и искажений. Если у Вас на сервере стоит этот драйвер.

  20. Анастасия сказал:

    Добрый день. Есть ли ограничение по количеству строк, единовременно загружаемых во внешний источник данных.MSSQLServer. Загружаю через набор данных. Загружаю 97 000 строк – все ОК. Загружаю 275 000 строк, при попытке записи в базу (НаборЗаписей.Записать(Истина);) все валится с ошибкой: Ошибка при вызове метода контекста (Записать): Ошибка внешней базы данных:
    ошибка при выполнении запроса: Ошибка ODBC. SQLSTATE: HY011
    Номер ошибки: 0
    Описание: [Microsoft][ODBC SQL Server Driver]Недопустимая операция в данное время
    Или проблема не в количестве записей?

    • Василий Ханевич сказал:

      Добрый день!
      В документации не встречал ограничений на количество записей.
      Рекомендую написать разработчикам платформы на v8@1c.ru, может, они подскажут, в чем тут проблема.

      • Анастасия сказал:

        С этой ошибкой я разобралась. SQL не пропускал за одну транзакцию столько строк. Теперь возникла другая ошибка: иногда при записи в БД вылетает ошибка: Ошибка при вызове метода контекста (Записать): Ошибка внешней базы данных:
        ошибка при выполнении запроса: Ошибка ODBC. SQLSTATE: 42S02
        Номер ошибки: 208
        Описание: [Microsoft][ODBC SQL Server Driver][SQL Server]Недопустимое имя объекта “#tt1”. Не знаете, что это может быть?

        • Василий Ханевич сказал:

          Добрый день!
          Подскажите, а сколько строк за раз максимально получалось записать?

          По поводу новой ошибки – видел зарегистрированную ошибку, попробуйте на тестовой 8.3.7:
          Код ошибки: 10143929
          Код(ы) обращения: SW901711
          Статус: Исправлена в тестовой версии
          Зарегистрирована: 23.01.2015
          Исправлена:
          “Технологическая платформа”, версия 8.3.7.1633 (для тестирования)
          Описание: При работе с временными таблицами внешнего источника данных SQL Server происходит ошибка Invalid object name ‘#tt1’

  21. dsdred сказал:

    при записи на прямую получил ошибку
    {Форма.Форма.Форма(376)}: Ошибка при вызове метода контекста (Записать): Ошибка внешней базы данных:
    ошибка при выполнении запроса: Ошибка ODBC. SQLSTATE: 23000
    Номер ошибки: 544
    Описание: [Microsoft][ODBC SQL Server Driver][SQL Server]Cannot insert explicit value for identity column in table ‘et6_ixvblgavt6f3’ when IDENTITY_INSERT is set to OFF.

    После чего прямо в SQL Server Management Studio сделал запрос
    SET IDENTITY_INSERT UNIT_TEST.et6_ixvblgavt6f3 ON
    Выполнение команд успешно завершено.

    Но ошибка осталась, не пойму что не хватает и как это вылечит…
    Что не так?

    • Василий Ханевич сказал:

      Добрый день!
      У меня такая же ошибка возникает, когда для таблицы с необъектными данными установить автоинкремент у одного из полей. Чего не хватает, я не понял. Автоинкремент заработал только для объектных данных.

      • dsdred сказал:

        Я лично смог победить только через хранимую процедуру в которую прописал SET IDENTITY_INSERT [таблица] ON;

        Примерно так:
        USE [kursy_test]
        GO
        CREATE PROCEDURE insert_nomenklatura
        @id int
        , @description nvarchar(150)
        , @price numeric(15, 2)
        AS BEGIN

        SET NOCOUNT ON;
        SET IDENTITY_INSERT [kursy_test].dbo.[nomenklatura] ON;

        INSERT INTO [kursy_test].dbo.[nomenklatura] ([id], [description] ,[price])
        VALUES (@id, @description, @price)
        END
        GO

        • Василий Ханевич сказал:

          Да, это вариант решения!
          Подскажите, вы обращались к разработчикам платформы на v8@1c.ru? Хочется понять, это ошибка платформы или какая-то особенность.

        • Антон сказал:

          Решение проблемы – УстановитьЗаписываемыеПоля()
          Указываем необходимые для записи, всё отлично работает.

  22. asashanis сказал:

    У меня так и остался нерешенным еще один вопрос. Не могу записать во внешний источник access данные типа null использую доп. запросы accessa чтобы потом исправить текущую дату на null. Ставил платформу 8.3.6.2041, так и ничего не вышло. В строку записывает строку “NULL”

    • Василий Ханевич сказал:

      Добрый день!
      Чтобы наверняка узнать, в чем проблема, рекомендую написать разработчикам платформы.
      Встречал только похожую ошибку платформы, которая была исправлена как раз в 8.3.6.2041.

  23. asashanis сказал:

    Конфа бухгалтерия предприятия 3.0.38.57, платформа 1С:Предприятие 8.3 (8.3.6.2041)

  24. asashanis сказал:

    Почему не дает записать данные в базу, аналогично в обычном приложение работает без вопросов. В управляемом вместо СоздатьОбъект() использую СоздатьМенеджерЗаписи(), есть какая-то разница?

    {Форма.Форма.Форма(353)}: Ошибка при вызове метода контекста (Записать)
    КонтрагентСРО.Записать();
    по причине:
    Ошибка внешней базы данных:
    ошибка при выполнении запроса
    по причине:
    Ошибка ODBC. SQLSTATE: 42000
    Номер ошибки: -3100
    Описание: [Microsoft][Драйвер ODBC Microsoft Access] Ошибка синтаксиса (пропущен оператор) в выражении запроса ”.

    • Василий Ханевич сказал:

      Добрый день!
      Разницы между обычным и управляемым приложением с точки зрения поведения внешних источников данных нет. Единственное, учитывайте разделение на клиентский и серверный контекст – не все типы данных доступны на клиенте.
      Для объектных данных используйте СоздатьОбъект(), для необъектных – СоздатьМенеджерЗаписи(). –

      • asashanis сказал:

        Спасибо, оказывается при записи попало в одно поле значение “Неопределено”, а рыская по инету кое-где нарывался на то что вообще записать нельзя, хотя понимал что если в обычном приложении записывается значит и в управляемом должно вот и подумал что может чего-то не так делаю.

  25. Алекс сказал:

    Есть внешний источник данных в PosgreSQL, из которого пытаюсь прочитать данные.
    Таблица:
    1 – id
    2 – name
    3 – fullname
    4 – tel
    Если подключаюсь из файловой базы, через виндовый ODBC-драйвер, проблем не возникает, получаю правильные данные:
    id = 1
    name = Иванов И.И.
    fullname = Иванов Иван Иванович
    tel = 9037778899
    Если подключаюсь с серверной 1С, установлена на Linux+PostgreSQL, через линуксовый ODBC-драйвер, получаю следующее:
    id = 1
    name = Иао .
    fullname = Иао внИаои
    tel = 93789

    Подскажите, где собака зарыта?

    • Василий Ханевич сказал:

      Добрый день!
      С такой проблемой явно не сталкивался. Первым делом я бы проверил настройки ODBC-драйвера в панели управления. Затем попробовал получить данные при помощи Excel. Проверьте строку соединения – postgresql
      Или попробуйте другую версию драйвера. Дистрибутивы здесь.

    • Василий Ханевич сказал:

      Еще такие сведения в интернете нашел.
      Попробуйте создать DSN, строка соединения вместо “Driver={PostgreSQL ANSI};Server=192.168.1.100;Port=5432;Database=base;UID=user;Pwd=pasword;” будет “DSN=YourDsn”, unixODBC может неправильно понимать символы {}.
      Попробуйте заменить драйвер в DSN с ANSI на UNICODE.
      Проверьте содержимое файла odbc.ini. При подключении ANSI-версией драйвера возможна ошибка, при переподключении UNICODE-версией ошибка исчезала, но для этого потребовалось перезапустить платформу.
      Удачи!

      • Алекс сказал:

        Подключение проводится через DSN с UNICODE.
        При этом стороннее подключение к этому DSN, не через 1С, выдает верные данные, т.е. сам odbc-драйвер выдает верные данные, а 1с отображает ерунду, как-то неправильно интерпретирует полученные данные.

        • Василий Ханевич сказал:

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

          • Алекс сказал:

            Ответ из 1С.
            Данная ошибка известна и зарегистрирована под номером 10143774.
            Исправление будет доступно в платформе 8.3.7

            Обходное решение:
            В некоторых дистрибутивах Linux присутствует обновленный unixOBDC (без SQL_WCHART_CONVERT).
            В таких случаях платформа 1С при работе с таким драйвером может пропускать символы в текстовых полях.
            В CentOS 6 данный драйвер собран с SQL_WCHART_CONVERT. В нем ошибка не воспроизводится.
            Также можно использовать провайдер iODBC, однако его необходимо собирать самостоятельно из исходников.
            Поэтому основная рекомендация – использовать CentOS

  26. Евгений сказал:

    Добрый день!
    Спасибо за статью.

    Вы случайно не сталкивались с проблемой, когда при записи в таблицу Oracle через внешний источник данных возникает сообщение:
    “Ошибка при вызове метода контекста (Записать): Ошибка внешней базы данных:
    ошибка при выполнении запроса: Ошибка ODBC. SQLSTATE: HY000
    Номер ошибки: 1000
    Описание: [Oracle][ODBC][Ora]ORA-01000: количество открытых курсоров превысило допустимый максимум”?

    Записываются необъектные данные, поэтому для записи используется набор записей внешнего источника данных. Создание набора записей происходит в начале процедуры, но установка отборов и запись происходит в цикле.
    Получается, что циклическая запись вызывает избыточное потребление курсоров Oracle? Почему так происходит и как этого избежать?

  27. asashanis сказал:

    Почему-то не получается передать значение NULL в поле внешней базы типа ДАТА и Число, пробовал как написано ниже в комментариях присвоить NULL строке – без проблем (версия 8.3.6.2076)

    • Василий Ханевич сказал:

      Добрый день!
      Для начала попробуйте на платформе 8.3.6.2041 выполнить эти же действия. Какой результат получится?
      В поле в базе MS SQL проверьте, что допускается значение NULL.
      А когда сохраняем в строковое поле, то получаем именно значение NULL в нем или строку “Null”?

        • Василий Ханевич сказал:

          У меня так же получалось на предыдущей платформе, после обновления перестало. База была на MS SQL Server.

      • asashanis сказал:

        Почему-то даже булево значение не получается внести, раньше получалось вносить -1 вместо истины, и 0 – ложь, теперь и это никак…

      • asashanis сказал:

        По поводу значения типа булева – пришлось придумать костыль… В ВИД значение типа булево переделываю в тип число, в выгрузке присваиваю полям с переделанными значениями -1 или 0 (Истина и Ложь) видимо по пути в базу происходит неявное преобразование и в базе уже отображаются нужные значения, как то криво это почему нельзя присвоить в правильный тип ИСТИНА или ЛОЖЬ… (база access)

        • Василий Ханевич сказал:

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

  28. Евгений сказал:

    Добрый день!
    Есть ли возможность, используя механизм внешних источников данных, выгружать данные из 1С не построчно, а целиком, таблицей значений, массивом, структурой.
    При получении данных из MSSQL в 1С таблица читается одним запросом.
    Спасибо.

    • Василий Ханевич сказал:

      Добрый день!
      Для таблиц внешнего источника данных с необъектными данными существует метод СоздатьНаборЗаписей(). При помощи набора записей можно оперировать не единичной строкой, например, загрузить данные из таблицы значений, а потом все вместе записать в базу данных.

      • Евгений сказал:

        Добрый день!
        А можно пример программы записи таблицы значений во внешний источник (MS SQL).
        Спасибо.

        • Василий Ханевич сказал:

          Добрый день!

              ТЗ = Новый ТаблицаЗначений;
              ТЗ.Колонки.Добавить("id", Новый ОписаниеТипов("Число"));
              ТЗ.Колонки.Добавить("price", Новый ОписаниеТипов("Число"));
              ТЗ.Колонки.Добавить("description", Новый ОписаниеТипов("Строка"));
              ТЗ.Колонки.Добавить("new", Новый ОписаниеТипов("Строка"));
             
              НоваяСтрока = ТЗ.Добавить();
              НоваяСтрока.id = 8;
              НоваяСтрока.price = 100;
              НоваяСтрока.description = "8";
              НоваяСтрока.new = "8";
             
              НоваяСтрока = ТЗ.Добавить();
              НоваяСтрока.id = 9;
              НоваяСтрока.price = 200;
              НоваяСтрока.description = "9";
              НоваяСтрока.new = "9";
             
              НаборЗаписей = ВнешниеИсточникиДанных.Nomen.Таблицы.dbo_nom.СоздатьНаборЗаписей();
              НаборЗаписей.Загрузить(ТЗ);
              НаборЗаписей.Записать();
          • Евгений сказал:

            Добрый день!
            А если таблица большая, 50000 строк к примеру, как контролируется целостность передачи данных.
            Спасибо.

            • Василий Ханевич сказал:

              Добрый день!
              Для обеспечения целостности данных существуют транзакции. Для работы с транзакциями предназначены методы НачатьТранзакцию(), ЗафиксироватьТранзакцию() и ОтменитьТранзакцию() менеджера внешнего источника данных.

          • Евгений сказал:

            Добрый день!
            Конструкция – НаборЗаписей = ВнешниеИсточникиДанных.Nomen.Таблицы.dbo_nom.СоздатьНаборЗаписей() не имеет метода СоздатьНаборЗаписей.

            “Метод объекта не обнаружен (СоздатьНаборЗаписей)”

            Спасибо.

            • Василий Ханевич сказал:

              Добрый день!
              Для таблицы dbo_nom должно быть установлено, что в ней содержатся необъектные данные, тогда будет доступен метод СоздатьНаборЗаписей().

              • Евгений сказал:

                Добрый день!
                Все работает, причем в варианте с набором записей в разы быстрее.
                Спасибо!

                • Василий Ханевич сказал:

                  Добрый день!
                  Отлично, что все заработало. Обращайтесь!
                  По возможности напишите кратко, какую задачу вы решали, из какой конфигурации выгружали данные, как организован обмен и т.д.

              • Алекс сказал:

                Есть во внешнем источнике данных таблица с тремя полями:
                id – числовое поле с автоинкриментом
                name – текст
                description – текст
                Поле “id” – доступно только для чтения, sql сам прописывает нужное значение.
                Однако, после смены типа данных для таблицы на необъектные, стал выдавать ошибку “Запись с такими ключевыми полями существует!”

                • Василий Ханевич сказал:

                  Добрый день!
                  У меня воспроизводится такая же ошибка. Автоинкремент у меня сработал только для объектных данных.
                  Если убрать поле id из ключа, то ошибка возникает следующая:
                  Ошибка внешней базы данных:
                  ошибка при выполнении запроса
                  по причине:
                  Ошибка ODBC. SQLSTATE: 23000
                  Номер ошибки: 544
                  Описание: [Microsoft][ODBC SQL Server Driver][SQL Server]Невозможно вставить явное значение для столбца идентификаторов в таблице “nomenklatura”, когда параметр IDENTITY_INSERT имеет значение OFF.

                  Хотя явно это поле не задается, для него включено свойство ТолькоЧтение:

                  &НаСервереБезКонтекста
                  Процедура СохранитьЗаписьНаСервере()
                     
                      Запись = ВнешниеИсточникиДанных.Nomen.Таблицы.dbo_nomenklatura.СоздатьМенеджерЗаписи();
                      Запись.price = 122;
                      Запись.description = "122";
                      Запись.Записать();
                     
                  КонецПроцедуры

                  Так что поведение платформы непонятно.

  29. Евгений сказал:

    А как передать в базу значение NULL

    ЗаписываемыйОбъект.Объект = NULL;
    ЗаписываемыйОбъект.Записать();

    Вызывает ошибку преобразования типов.

    • Василий Ханевич сказал:

      Добрый день!
      У меня воспроизводится такое же поведение. Если поле имеет числовой тип, то возникает указанная ошибка. А если поле строковое, то в него записывается строка “NULL”. Поведение платформы непонятно. Похоже на ошибку платформы.

    • Василий Ханевич сказал:

      Добрый день!
      Проверил на новой версии платформы 8.3.6.2041. На ней ошибка уже не воспроизводится. Удалось запись значение NULL как в строковое, так и в числовое поле.
      В техподдержке сообщили, что это исправлена ошибка 20028661.

  30. Александр сказал:

    Спасибо большое за статью.
    Столкнулся с такой проблемой – пытаюсь получить коллекцию строк внешней таблицы MS SQL для обхода всех и изменения нескольких полей при определённых условиях. И как не пытаюсь – сталкиваюсь с ошибкой( Не подскажете как такое реализовать?

    • Василий Ханевич сказал:

      Добрый день!
      Напишите, пожалуйста, подробнее, что именно вы делаете и какая ошибка возникает.

  31. George сказал:

    Очень полезная статья. Подскажите как в 1С прочитать возвращаемое значение хранимой процедуры в SQL?

    • Василий Ханевич сказал:

      Добрый день!
      Действуем по аналогии с описанным в статье. Если в конфигураторе в свойствах функции внешнего источника данных установим галочку Возвращает значение, то можно будет использовать возвращаемое значение далее в программном коде. Например, так:

      ВозвращаемоеЗначение = ВнешниеИсточникиДанных.Nomenklatura.ИмяФункции();
      • Сергей сказал:

        Если в свойствах хранимой процедуры внешнего источника установить флаг “Возвращает значение”, то 1С начитает воспринимать её как функцию и при вызове выдает ошибку.
        А есть ли возможность получить именно значение хранимой процедуры, когда это значение возвращается в один из входных параметров?

        • Василий Ханевич сказал:

          Не встречал в документации и в интернете указания такой возможности.

  32. Виктор сказал:

    Статья хорошая, но все показывают примеры для SQl, а где можно посмотреть подключение к PostgreeSQl? Что должно быть установлено дополнительно к 1с и как происходит подключение (внешние источники данных)? Спасибо

    • Василий Ханевич сказал:

      Добрый день!
      Необходимо установить ODBC-драйвер для PostgreSQL. В зависимости от разрядности ОС установите 32- или 64-разрядные драйвера. Строку подключения внешнего источника, а также про некоторые другие настройки самой СУБД можно прочитать тут. Про работу 1С с PostgreSQL при помощи ODBC написано еще здесь.

  33. CleverGirl сказал:

    Интересная и полезная статья, НО возник вопрос по поводу отображения данных из ВИД на форме списка:
    – стандартная форма выводится пустой, но поиск по ней срабатывает,
    – динамический список не срабатывает.
    Не подскажете, в чем может быть проблема?
    ВИД – база SQL.

    • Василий Ханевич сказал:

      Добрый день!
      Напишите, пожалуйста, подробнее, как вы подключаетесь к внешнему источнику, какие настройки у таблицы внешнего источника, как воспроизвести такое поведение системы. По возможности прикрепите скриншоты для наглядности.

        • Василий Ханевич сказал:

          У меня получилось воспроизвести подобную ошибку на своей базе. В 1С я отмечаю поле id из внешней таблицы как поле ключа, а в базе MS SQL id не является ключевым (т.е. допускаются дубли). Если значения в поле id повторяются в разных строках, то 1С в динамическом списке не хочет отображать такие данные, а в консоли они нормально выбираются.

  34. Олег сказал:

    Кто-нибудь пробовал создавать приложения-оболочки на платформе 1С для СУБД Oracle различных версий? К примеру на замену устаревшего функционала одного из приложений, написанного на Delphi, для развития функциональности приложения, сопряжения с конфигурацией 1С. Это может быть необходимо, если СУБД Oracle используется целой системой приложений, от которых невозможно отказаться и перейти полностью на 1С. В этом случае необходимо обеспечить параллельную работу 1С и сторонней системы, заменив в сторонней системе только часть функционала, переписав его в 1С.
    А теперь вопрос: кто сталкивался с проблемой неадекватного поведения динамических списков для форм списков таблиц ВИД на СУБД Oracle, если не “ломать” Oracle подменой файлов таблицы лингвистической сортировки? У меня к примеру список при листании “зацикливается”, не русские буквы оказываются где попало и т.п.

    • hanv сказал:

      Документация к “1С:Предприятие 8” содержит такой фрагмент:

      До начала использования сервера Oracle Database с «1С:Предприятием» необходимо выполнить настройку multilingual collation для сервера баз данных. Для этого нужно выполнить следующее:
      – Скопировать файл lx327c6.nlt из каталога Additional\OracleDatabase дистрибутивного диска «1С:Предприятия» в пустой каталог на жестком диске компьютера, на котором установлен Oracle Database.
      – Запустить Oracle Locale Builder (lbuilder).
      – Запустить генерацию nlb-файлов (Tools – Generate NLB), указав папку с файлом lx327c6.nlt.
      – Остановить все сервисы Oracle Database, запущенные из домашнего каталога Oracle Database (ORACLE_HOME).
      – Создать резервную копию файлов lx0boot.nlb и lx1boot.nlb из папки ORACLE_HOME/nls/data.
      – Скопировать файлы lx1boot.nlb и lx327c6.nlb из папки, где они были созданы утилитой Oracle Locale Builder в ORACLE_HOME/nls/data. В процессе копирования утвердительно ответить на предложение перезаписать файл lx1boot.nlb.
      – Запустить сервисы Oracle Database.

      Коллеги, работающие с Oracle, рекомендуют поднять для работы с 1С отдельный инстанс с правильными кодировками.

      • Олег сказал:

        Проблема в том, что речь идет не о базе 1С, хранящейся на сервере Oracle. В этом случае Oracle обеспечивает хранение данных 1С и правильно “точить” Oracle под требования 1С. Но речь идет о внешнем источнике данных. Согласно идеологии 1С внешние источники данных- универсальный механизм, позволяющий работать с любыми источниками данных с использованием ODBC. Соответственно 1С НЕ ИМЕЕТ ПРАВА “ломать” внешний источник данных под себя, т.к. эта база используется другими приложениями и “заточена” под них. Если “заточить” базу под 1С, то могут сломаться другие приложения, использующие эту базу, что НЕДОПУСТИМО. В этом случае 1С должна уметь “приспосабливаться” под любой источник данных, а не наоборот.

        • hanv сказал:

          В примере выше предполагалось, что таблица nomenklatura – внешняя. А скрипт создания таблицы приведен как раз для демонстрации того, что эта таблица не хранит данные справочника или другого объекта метаданных 1С. Т.е. платформа 1С не “ломает” данные внешней таблицы под себя, а использует их, в том числе может и записывать в нее.

          • Олег сказал:

            Вот это:

            До начала использования сервера Oracle Database с «1С:Предприятием» необходимо выполнить настройку multilingual collation для сервера баз данных. Для этого нужно выполнить следующее:
            – Скопировать файл lx327c6.nlt из каталога Additional\OracleDatabase дистрибутивного диска «1С:Предприятия» в пустой каталог на жестком диске компьютера, на котором установлен Oracle Database.
            – Запустить Oracle Locale Builder (lbuilder).
            – Запустить генерацию nlb-файлов (Tools – Generate NLB), указав папку с файлом lx327c6.nlt.
            – Остановить все сервисы Oracle Database, запущенные из домашнего каталога Oracle Database (ORACLE_HOME).
            – Создать резервную копию файлов lx0boot.nlb и lx1boot.nlb из папки ORACLE_HOME/nls/data.
            – Скопировать файлы lx1boot.nlb и lx327c6.nlb из папки, где они были созданы утилитой Oracle Locale Builder в ORACLE_HOME/nls/data. В процессе копирования утвердительно ответить на предложение перезаписать файл lx1boot.nlb.
            – Запустить сервисы Oracle Database.

            по Вашему “НЕ ЛОМКА” Oracle Database?! А как по Вашему поведут себя приложения, работающие с этим сервером и не рассчитанные на эксклюзивный порядок сортировки от 1С? Абсолютное большинство разработчиков в Мире использует стандартные для Oracle порядки сортировок, т.к. их неймоверное количество. А 1С требует подменить стандартные файлы только потому, что ее писали изначально под MS SQL и использовали именно его лингвистический порядок сортировки. Динамические списки построены на СКД, которая построена в расчете на микрософтовский порядок лингвистической сортировки. Вот и выходит, что реализованные сейчас внешние источники данных абсолютно не универсальный механизм работы с любыми источниками данных через ODBC, без их “ломания”.

            • hanv сказал:

              В документации приводятся необходимые требования для работы Oracle с 1С.
              Также рекомендую обратиться напрямую к 1С с детальным описанием воспроизведения некорректного поведения системы. Возможно, они посоветуют, как следует поступить в этой ситуации.

              • Олег сказал:

                В документации приводятся необходимые требования для работы Oracle ТОЛЬКО С 1С, если СУБД используется ТОЛЬКО для хранения баз 1С. Но у меня другой случай. Механизм внешних источников данных позиционируется как УНИВЕРСАЛЬНЫЙ для работы с ЛЮБЫМИ СУБД через ODBC. Соответственно не СУБД надо “нагибать” под 1С, а 1С “нагибать” под СУБД.
                А в 1С я уже обратился. Там сказали что я единственный(?!), кто обратился с такой проблемой. Они там чего-то пока думают и обсуждают. Предложили не пользоваться динамическими списками. А через как тогда список записей таблицы ВИД на форму выводить? Я предложил для ВИД разработать отдельные динамические списки, которые не должны использовать типовую СКД, “заточенную” под MS SQL. Сказали подумают.
                Неужели я действительно единственный на всей территории распространения 1С пытаюсь использовать ВИД для работы с СУБД Oracle Database? А как-же главный конкурент 1С- SAP, который преимущественно на Oracle работает и еще море различных систем написанных под Oracle? Или туда 1С-ников под страхом смерти не пускают, чтобы дров не наломали?

                • hanv сказал:

                  А через как тогда список записей таблицы ВИД на форму выводить?

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

                • Олег сказал:

                  Ответ на пост hanv 12.08.2014 (почему-то нет ссылки “Ответить”):

                  Вы представляете себе скорость работы такого “костыля”, когда в таблице несколько миллионов записей и таблица интенсивно используется несколькими тысячами пользователей? Такую таблицу значений необходимо еще и перерисовывать каждые 20-30 сек. и при изменении/добавлении/удалении записи пользователем. Как думаете, понравится людям, работавшим в другом приложении работать в 1С, которая будет несколько минут только таблицу отрисовывать?
                  Попробуйте реализовать таким образом форму списка справочника номенклатуры, с несколькими сотнями тысяч записей (в конфигурации “Упр.торговлей” для сети супермаркетов), тогда поймете всю абсурдность такого предложения.
                  Это не выход, а “страшное костылище”. Необходим только “правильный” динамический список для ВИД.

        • Vovan58 сказал:

          У меня были похожие проблемы но с DBF файлами. Я выбрал тогда вариант через OLE DB, т.к. варианты внешнего источника и XBase не давали правильной кодировки.

  35. Олег сказал:

    На сколько я понимаю в 8.3.5 никак не реализован механизм автоматического назначения значения ключевого поля для объектных таблиц. Обычно для этого различные SQL-сервера используют последовательности (sequence), которые имеют поле NextVal. Каждый раз при обращении к последовательности можно автоматически получить новое значение для ключевого поля. А как использовать последовательности в 1С для внешних источников данных?

    • hanv сказал:

      На примере MS SQL Server можно сделать следующим образом.
      Если в таблице в базе данных поле id создать как столбец идентификаторов (со свойством IDENTITY):

      CREATE TABLE [dbo].[nomenklatura](
      [id] [int] IDENTITY NOT NULL,
      [description] [nvarchar](150) NOT NULL,
      [price] [numeric](15, 2) NULL,
      CONSTRAINT [PK_id] PRIMARY KEY ([id])
      )

      Кроме того, если для поля id в 1С установить свойство ТолькоЧтение, то при выполнении следующего кода сработает автоинкремент:

      Процедура СоздатьПрограммноНаСервере()
          ЗаписываемыйОбъект = ВнешниеИсточникиДанных.Nomenklatura.Таблицы.dbo_nomenklatura.СоздатьОбъект();
          ЗаписываемыйОбъект.description = "Шкаф";
          ЗаписываемыйОбъект.price = 5000;
          ЗаписываемыйОбъект.Записать();
      КонецПроцедуры

      Объект метаданных Последовательность в 1С позволяет решать задачи контроля хронологической последовательности ввода документов. К внешним источникам данных отношения не имеет.

      • Олег сказал:

        1) Как я писал внешние источники данных- универсальный механизм, позволяющий 1С работать с любыми источниками данных через ODBC. Изначально предполагается что эти источники используются другими приложениями. Соответственно 1С НЕ ИМЕЕТ ПРАВА вносить какие-либо изменения в структуру данных, чтобы не нарушить работу “родных” приложений этой базы данных. 1С имеет право лишь подключаться к этим источниками и получать/записывать данные. Причем запись данных должна происходить согласно правил “родных” приложений, использующих эту базу данных (внешний источник данных для 1С). По этому запрос на создание таблицы “удобной для 1С” не корректно.
        2) Вы уверены, что при записи нового объекта типа “Таблица внешнего источника данных” 1С самостоятельно заполнит значение ключевого поля? Ведь это “не родной” для 1С объект, как справочник, документ и т.п. Откуда 1С может знать по какому алгоритму должны устанавливаться значения для этого поля? А если для ряда таблиц специально создана в базе данных единая последовательность для генерации уникальных значений id и заданы соответствующие ограничения на уровне СУБД? 1С ведь при записи данных ОБЯЗАНА подражать “родному” для базы данных приложению, иначе “родные” приложения могут “заглючить”!

        • hanv сказал:

          1) Скрипт на создание таблицы – это не пример создания таблицы “удобной для 1С”, а демонстрация структуры данных внешнего источника, важно будет только свойство IDENTITY (см. п. 2 ниже).

          2) В приведенном примере ключевое поле id точно заполнится при записи. Только сделает это не 1С (поскольку для этого поля в 1С установлено значение ТолькоЧтение), а MS SQL, т.к. столбец id создан как столбец идентификаторов со свойством IDENTITY. Т.е. увеличение счетчика на 1 будет выполнено при записи автоматически. Если необходим произвольный алгоритм назначения этого поля, то можно воспользоваться хранимыми процедурами MS SQL (stored procedure).

          Еще раз обращаю внимание, что платформа 1С не знает, по какому алгоритму будет назначено новое значение счетчика id, это действие выполняет MS SQL, в 1С для этого поля внешней таблицы установлено свойство ТолькоЧтение.

          • Олег сказал:

            Вы так и не поняли меня. Я писал в самом начале, что разработчики для формирования уникальных значений ключевых полей таблиц часто используют ПОСЛЕДОВАТЕЛЬНОСТИ (sequence/generator). Причем иногда одна последовательность используется для формирования ключевых значений нескольких таблиц. При этом к примеру в Oracle, в запросе на создание новых записей вместо конкретного значения ключевого поля указывается Sequence.nextval.
            Как в этом случае “прикрутить” последовательность в ВИД к таблицам ВИД?

            • hanv сказал:

              У нас задача – сформировать значение ключевого поля таблицы внешнего источника данных. В MS SQL для этих целей можно объявить столбец идентификаторов со свойством IDENTITY. Именно поэтому я и приводил такой пример. В Oracle нельзя сделать поле, автоматически увеличивающее свое значение напрямую, как поле IDENTITY в MS SQL. Поэтому для этих целей используются последовательности (sequence), при помощи которых можно реализовать и сквозную нумерацию в нескольких таблицах. Для получения очередного уникального значения последовательность можно использовать через триггер, в котором и обращаться к sequence.NEXTVAL. А в 1С для ключевого поля следует установить свойство ТолькоЧтение.

              • Олег сказал:

                Ну снова Вы двигаете идею “нагнуть” стороннюю СУБД под нужды 1С. Механизм внешних источников данных сама 1С описывает как УНИВЕРСАЛЬНЫЙ для работы с различными СУБД. Ну не использовал разработчик триггеры, чтобы увязать ключевые поля таблиц с последовательностью и что? Теперь лезть в СУБД и “дорисовывать” это за разработчика? А как 1С посмотрит на то, что в ее базу начнут лазить кому не лень и “дорисовывать” там чего им надо?
                Правильно будет если 1С как-то “научить” использовать последовательности для генерации платформой нужного запроса. А последовательности, которые давным давно существуют в Oracle, DB2, PostgreSQL, Firebird и т.д., уже и в MS SQL 2011 появились. Я пробовал последовательность СУБД как-то функцией ВИД в 1С описать, но ничего не вышло. Вот и спросил здесь, может у кого получилось.

                • hanv сказал:

                  Возможен такой вариант реализации на примере, описанном в статье, правда изменения в базу данных все-таки вносятся. Пример будет на MS SQL.

                  Пусть последовательность объявлена так:

                  CREATE SEQUENCE MySequence
                  START WITH 1
                  INCREMENT BY 1;
                  GO

                  Процедура выглядеть будет выглядеть следующим образом:

                  USE [kursy_test]
                  GO
                  CREATE PROCEDURE insert_nomenklatura
                  @description nvarchar(150),
                  @price numeric(15, 2)
                  AS
                  BEGIN
                  INSERT INTO [kursy_test].dbo.[nomenklatura] ([id], [description] ,[price])
                  VALUES (NEXT VALUE FOR MySequence, @description, @price)
                  END
                  GO

                  В 1С тогда будет использоваться следующий программный код:

                  ВнешниеИсточникиДанных.Nomenklatura.dbo_insert_nomenklatura(Объект.description, Объект.price);
                • Олег сказал:

                  Ответ на пост hanv 12.08.2014:

                  Не выход это. НЕЛЬЗЯ (не по идеологии ВИД) вносить изменения в структуру сторонней СУБД, т.к. в любой момент при обновлении “родной” для этой базы системы она может просто “убить” все “не родные” рудименты и 1С начнет сыпать ошибками. А чтобы этого не происходило- 1С должна “уметь” выдавать команды напрямую СУБД на языке SQL. Для этого я предлагал разработчикам реализовать метод “ВнешниеИсточникиДанных..Выполнить()”. Тогда из 1С можно будет создавать/проверять/восстанавливать объекты СУБД, необходимые для работы 1С. Также 1С не хватает событий (и модулей обработчиков) для менеджера ВИД: ПослеПодключения (для проверки/создания доп.объектов в СУБД), ПриОбрывеСоединения (чтобы не заключать каждое обращение к ВИД в Попытка-Исключение), ПриОшибкеВыполненияЗапроса (чтобы отлавливать и восстанавливать объекты, созданные 1С и “убитые” другой системой уже после подключения к ВИД, в ходе работы).
                  А выход с последовательностями нашел: можно в 1С создать функцию, с выражением в источнике данных типа “..Nextval и через запрос 1С получать следующее значение, которое присваивать нужному ключевому полю таблицы перед записью нового объекта в ВИД.

  36. danila сказал:

    Насчет транзакций…
    Насколько я понял невозможно использовать следующее. Если данные во внешний источник в транзакции записаны успешно то и в БД они должны быть записаны в транзакции. Если будет отмена транзакции в БД то мы уже не сможет повлиять на транзакцию в сиквеле.
    Или есть возможность работать с транзакцией так, чтобы мы могли записать одновременно и в БД и во внешний источник, либо не писать в оба места?

    • hanv сказал:

      Смотрите, с одинаковыми именами есть методы глобального контекста и методы объекта ВнешнийИсточникДанныхМенеджер:
      – НачатьТранзакцию();
      – ЗафиксироватьТранзакцию();
      – ОтменитьТранзакцию().

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

      НачатьТранзакцию();
      //запись некоторого объекта 1С
      ВнешниеИсточникиДанных.ИмяИсточника.НачатьТранзакцию();
      //запись внешнего источника
      Если НекоторыйПризнак Тогда
          ВнешниеИсточникиДанных.ИмяИсточника.ОтменитьТранзакцию();
          ОтменитьТранзакцию();
      КонецЕсли;
  37. Aletar сказал:

    Интересно, а если в транзакции 1С (НачатьТранзакцию()) записать данные во внешней источник данных, а потом транзакцию отменить, что произойдет во внешнем источнике данных? Надо проверить при случае.

    • hanv сказал:

      Обратите внимание, что для работы с транзакциями следует воспользоваться методами объекта ВнешнийИсточникДанныхМенеджер НачатьТранзакцию() и ОтменитьТранзакцию():

      ВнешниеИсточникиДанных.Nomenklatura.НачатьТранзакцию();
      ЗаписываемыйОбъект = ВнешниеИсточникиДанных.Nomenklatura.Таблицы.dbo_nomenklatura.СоздатьОбъект();
      ЗаписываемыйОбъект.id = 5;
      ЗаписываемыйОбъект.description = "Шкаф";
      ЗаписываемыйОбъект.price = 5000;
      ЗаписываемыйОбъект.Записать();
      ВнешниеИсточникиДанных.Nomenklatura.ОтменитьТранзакцию();

      В этом случае в таблице БД новая запись не появится.

      В случае выполнения следующего кода запись в БД появится, даже несмотря на отмену транзакции:

      НачатьТранзакцию();
      ЗаписываемыйОбъект = ВнешниеИсточникиДанных.Nomenklatura.Таблицы.dbo_nomenklatura.СоздатьОбъект();
      ЗаписываемыйОбъект.id = 5;
      ЗаписываемыйОбъект.description = "Шкаф";
      ЗаписываемыйОбъект.price = 5000;
      ЗаписываемыйОбъект.Записать();
      ОтменитьТранзакцию();
  38. Дмитрий Рудаков сказал:

    Да здорово, конечно у них с источниками данных не все работает :))), но все равно очень полезно знать на всякий случай данный инструмент, глядишь, порядок и с ним наведут. А мы благодаря вам уже знакомы с его механизмами :)

  39. Вадим сказал:

    Огромное спасибо за статью! Давно был заинтересован этой темой. Как только появились ВИД, делал интеграцию 1с с Redmine, но тогда, к сожалению, таких возможностей по записи в саму БД не было…Но теперь..)))
    Кстати, не могли бы вы подсказать, в какой версии платформы появится Планировщик и будет ли она работать для мобильной платформы? Заранее спасибо. )

    • hanv сказал:

      В финальной версии 8.3.5, скорее всего, уже не будет. В 8.3.5 пока устранение проблем, некоторые вопросы производительности и только некоторые новшества. Так что ждем в 8.3.6:) Про Планировщик в мобильной платформе информации, к сожалению, не видел.

    • Сергей сказал:

      Подскажите, пожалуйста, в чем заключалась интеграция с redmine? Какой функцонал реализован?

  40. SergTH000 сказал:

    С выходами новых релизов платформы внешние источники данных развивались, например, стало возможным помещение во временные таблицы, выполнение соединений с обычными таблицами.

    Не могли бы вы уточнить, с какого релиза платформы это стало возможно?

    • hanv сказал:

      Реализована возможность работы с временными таблицами для внешних источников данных – 8.3.1.

  41. Сергей Костяков сказал:

    Спасибо, но это все понятно. Лучше подскажите, как подключиться к кубам, до сих пор не удалось.

    • Евгений Гилев (Мастер-тренер) сказал:

      Доброго дня, Сергей!

      Тема для новой статьи записана :)

  42. dumal сказал:

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

  43. Игорь сказал:

    Спасибо!
    Очень полезная информация, а главное актуальная для меня

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Мы используем файлы cookies, чтобы сделать сайт удобнее.
Продолжая просмотр сайта, Вы соглашаетесь с их использованием.
Подробнее