Особенности работы с COM-соединением

22.02.23

Интеграция - Обмен между базами 1C

О чём и зачем данная статья? Казалось бы, что написано об этом соединении очень много, да и технология устаревшая... И мне так раньше казалось! Однако, столкнувшись с необходимостью на двух проектах подряд работать с этой технологией, стало понятно, что описание трудных ситуаций или отсутствует, или есть только на форумах, что крайне неудобно! Поэтому особенности работы с COM соберу в одном месте, чтоб не искать в будущем.

На моих проектах суть работы с COM-соединением состояла из следующих шагов:

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

2. Преобразование ссылочных полей в примитивные типы данных, которые можно прочитать на стороне базы приёмника.

3. Тестирование кода сначала без COM-соединения. Для этого код пишется во внешней обработке для базы источника. 

4. Перенос кода в базу приёмник. Здесь и начинается самое весёлое! Сделать так, чтоб код, который уже отлажен, заработал через COM-соединение.

5. Преобразование таблиц из COM-объекта в тип "Таблица значений".

6. Поиск/создание ссылок. Поиск идёт по ключевым полям, которые на шаге 2 были преобразованы в примитивные типы данных.

7. Загрузка данных.

 

Все проблемы, с которыми я столкнулся, были на шаге 4 и 5. И именно об этих двух шагах моя публикация. 

Но для того, чтоб статья содержала полную информацию, начну с начала. 

 

Этап 1. Подключение к базе.

 

Для подключения нужны 4 параметра:

1. Имя сервера

2. Имя базы

3. Имя пользователя

4. Пароль.

 

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

Обычно задаю эти параметры в коде или в регистре сведений. В коде выглядит так:

//Установим параметры по умолчанию
Сервер = "Srvr=""s-dcr-db02.int""";
ИмяБазы = "Ref=""1c8mskrzn""";
ИмяПользователя = "Usr=""Филатов Павел""";
Пароль = "Pwd=""какой-то пароль""";

ПутьКБазе = Сервер + ";" + ИмяБазы + ";" + ИмяПользователя + ";" + Пароль;

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

 

 

Код кнопки подключиться к базе:

&НаКлиенте
Процедура ПодключитьсяКБазе(Команда)
    ПодключитьсяКБазеНаСервере();
КонецПроцедуры

&НаСервере
Процедура ПодключитьсяКБазеНаСервере()

    Если ПодключениеУстановлено Тогда
        Если ЗначениеЗаполнено(АдресCOMСоединения) Тогда
            УдалитьИзВременногоХранилища(АдресCOMСоединения);
        КонецЕсли;

        ПодключениеУстановлено = Ложь;
    Иначе
        Если Не ЗначениеЗаполнено(ПутьКБазе) Тогда
            Возврат;
        КонецЕсли;
		
        COMСоединение = Новый COMObject("V83.COMConnector");
        Попытка
            ПодключениеКБазе = COMСоединение.Connect(ПутьКБазе);
			
            //Если ранее было помещено соединение, удаляем его и помещаем новое
            Если ЗначениеЗаполнено(АдресCOMСоединения) Тогда
                УдалитьИзВременногоХранилища(АдресCOMСоединения);
            Иначе
                АдресCOMСоединения = ПоместитьВоВременноеХранилище(Новый Структура("ПодключениеКБазе", ПодключениеКБазе), Новый УникальныйИдентификатор);
            КонецЕсли;
			
            ПодключениеУстановлено = Истина;
        Исключение
            Инфо = ИнформацияОбОшибке();
            Возврат;
        КонецПопытки;	
    КонецЕсли;

    Элементы.ПодключитьсяКБазе.Пометка = ПодключениеУстановлено;

КонецПроцедуры // ПодключитьсяКБазеУТНаСервере()

Сразу расскажу, зачем кладу во временное хранилище... 

Даже если в модуле описать переменную ПодключениеКБазе как серверную, то это не гарантирует, что при следующем переходе с клиента на сервер она Вас там "будет ждать".

Поэтому она помещается в хранилище, а адрес запоминается в переменной формы "АдресCOMСоединения".

При следующем серверном вызове пишу такой код:

Если ЗначениеЗаполнено(АдресCOMСоединения) Тогда
    СтруктураДанных = ПолучитьИзВременногоХранилища(АдресCOMСоединения);
    ПодключениеКБазе = СтруктураДанных.ПодключениеКБазе;
Иначе 
    Возврат;
КонецЕсли;

//Получаем обработку как объект. К ней в модуле объекта привязаны ключевые переменные с данными.
ОбработкаОбъект = РеквизитФормыВЗначение("Объект");
ОбработкаОбъект.ПодключениеКБазе = ПодключениеКБазе;
ОбработкаОбъект.МенеджерВременныхТаблиц = ПодключениеКБазе.NewObject("МенеджерВременныхТаблиц");

И вот теперь с нами везде на сервере будет COM-соединение. Получение данных пишем в модуле объекта (у внешних обработок нет модуля менеджера).

 

Этап 2. Создание объектов через конструктор "Новый".

Почти все объекты создаются без особенностей с помощью конструкции NewObject(). В скобках в кавычках указывается название объекта. 

Примеры наиболее часто используемых конструкций без особенностей:

Запрос = ПодключениеКБазе.NewObject("Запрос");
МенеджерВременныхТаблиц = ПодключениеКБазе.NewObject("МенеджерВременныхТаблиц");

Массив = ПодключениеКБазе.NewObject("Массив");
СписокЗначений = ПодключениеКБазе.NewObject("СписокЗначений");
Структура = ПодключениеКБазе.NewObject("Структура");
Соответствие = ПодключениеКБазе.NewObject("Соответствие");
Таблица = ПодключениеКБазе.NewObject("ТаблицаЗначений");

Особенности возникают при создании полей в таблице и описании их типов. Если без использования соединения код создания полей выглядит так:

//Получение квалификаторов строки, числа
КвалификаторыЧисла15_2 = Новый КвалификаторыЧисла(15, 2);
КвалификаторыСтроки150 = Новый КвалификаторыСтроки(150);

//Через COM-соединение
КвалификаторыЧисла15_2 = ПодключениеКБазе.NewObject("КвалификаторыЧисла", 15, 2);
КвалификаторыСтроки150 = ПодключениеКБазе.NewObject("КвалификаторыСтроки", 150);

//Получение описания типов числа
ОписаниеТиповЧисла15_2 = Новый ОписаниеТипов("Число",,, КвалификаторыЧисла15_2);

//Через COM-соединение
ОписаниеТиповЧисла15_2 = ПодключениеКБазе.NewObject("ОписаниеТипов", "Число", КвалификаторыЧисла15_2);

//Получение описания типов строки
ОписаниеТиповСтроки150 = Новый ОписаниеТипов("Строка",,,, КвалификаторыСтроки150);

//Через COM-соединение
ОписаниеТиповСтроки150 = ПодключениеКБазе.NewObject("ОписаниеТипов", "Строка", КвалификаторыСтроки150);

//Получение описания ссылочных типов
ОписаниеТиповПодразделения = Новый ОписаниеТипов("СправочникСсылка.ПодразделенияОрганизаций");

//Через COM-соединение
ОписаниеТиповПодразделения = ПодключениеКБазе.NewObject("ОписаниеТипов", "СправочникСсылка.ПодразделенияОрганизаций");

Как видно из приведённых примеров, все параметры указываются через запятую, после названия создаваемого объекта.

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

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

1. Функция "ПолучитьСтруктуруОписанияТипов" получает все необходимые мне типы значений, что сильно сокращает количества кода при создании полей. Ниже её код, в т.ч. для COM-соединения:

//Обычный код
Функция ПолучитьСтруктуруОписанияТипов()

    КвалификаторыЧисла15_2 = Новый КвалификаторыЧисла(15, 2);
    КвалификаторыЧисла15_3 = Новый КвалификаторыЧисла(15, 3);
    КвалификаторыЧисла3_0 = Новый КвалификаторыЧисла(3, 0);
    КвалификаторыЧисла6_0 = Новый КвалификаторыЧисла(6, 0); 
    КвалификаторыЧисла10_0 = Новый КвалификаторыЧисла(10, 0); 
    КвалификаторыЧисла10_2 = Новый КвалификаторыЧисла(10, 2); 
    КвалификаторыЧисла6_2 = Новый КвалификаторыЧисла(6, 2); 
    КвалификаторыЧисла8_2 = Новый КвалификаторыЧисла(8, 2); 
	
    КвалификаторыСтроки9 = Новый КвалификаторыСтроки(9);
    КвалификаторыСтроки150 = Новый КвалификаторыСтроки(150);
    КвалификаторыСтроки350 = Новый КвалификаторыСтроки(350);
	
    ОписаниеТиповЧисла15_2 = Новый ОписаниеТипов("Число",,, КвалификаторыЧисла15_2);
    ОписаниеТиповЧисла15_3 = Новый ОписаниеТипов("Число",,, КвалификаторыЧисла15_3);
    ОписаниеТиповЧисла3_0 = Новый ОписаниеТипов("Число",,, КвалификаторыЧисла3_0);
    ОписаниеТиповЧисла6_0 = Новый ОписаниеТипов("Число",,, КвалификаторыЧисла6_0);
    ОписаниеТиповЧисла10_0 = Новый ОписаниеТипов("Число",,, КвалификаторыЧисла10_0);
    ОписаниеТиповЧисла10_2 = Новый ОписаниеТипов("Число",,, КвалификаторыЧисла10_2);
    ОписаниеТиповЧисла6_2 = Новый ОписаниеТипов("Число",,, КвалификаторыЧисла6_2);
    ОписаниеТиповЧисла8_2 = Новый ОписаниеТипов("Число",,, КвалификаторыЧисла8_2);
	
    ОписаниеТиповПодразделения = Новый ОписаниеТипов("СправочникСсылка.ПодразделенияОрганизаций");
    ОписаниеТиповСотрудники = Новый ОписаниеТипов("СправочникСсылка.СотрудникиОрганизаций");
    ОписаниеТиповФизическиеЛица = Новый ОписаниеТипов("СправочникСсылка.ФизическиеЛица");
    ОписаниеТиповДолжности = Новый ОписаниеТипов("СправочникСсылка.ДолжностиОрганизаций");
	
    ОписаниеТиповСтроки9 = Новый ОписаниеТипов("Строка",,,, КвалификаторыСтроки9);
    ОписаниеТиповСтроки150 = Новый ОписаниеТипов("Строка",,,, КвалификаторыСтроки150);
    ОписаниеТиповСтроки350 = Новый ОписаниеТипов("Строка",,,, КвалификаторыСтроки350);
	
    ОписаниеТиповБулево = Новый ОписаниеТипов("Булево");
    ОписаниеТиповДаты = Новый ОписаниеТипов("Дата");

    СтруктураОписанияТипов = Новый Структура;
	
    СтруктураОписанияТипов.Вставить("ОписаниеТиповПодразделения", ОписаниеТиповПодразделения);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповСотрудники", ОписаниеТиповСотрудники);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповФизическиеЛица", ОписаниеТиповФизическиеЛица);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповДолжности", ОписаниеТиповДолжности);

    СтруктураОписанияТипов.Вставить("ОписаниеТиповЧисла15_2", ОписаниеТиповЧисла15_2);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповЧисла15_3", ОписаниеТиповЧисла15_3);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповЧисла3_0", ОписаниеТиповЧисла3_0);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповЧисла6_0", ОписаниеТиповЧисла6_0);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповЧисла10_0", ОписаниеТиповЧисла10_0);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповЧисла10_2", ОписаниеТиповЧисла10_2);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповЧисла6_2", ОписаниеТиповЧисла6_2);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповЧисла8_2", ОписаниеТиповЧисла8_2);
	
    СтруктураОписанияТипов.Вставить("ОписаниеТиповСтроки9", ОписаниеТиповСтроки9);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповСтроки150", ОписаниеТиповСтроки150);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповСтроки350", ОписаниеТиповСтроки350);
	
    СтруктураОписанияТипов.Вставить("ОписаниеТиповБулево", ОписаниеТиповБулево);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповДаты", ОписаниеТиповДаты);
	
Возврат СтруктураОписанияТипов;

КонецФункции // ПолучитьСтруктуруОписанияТипов()


//Для COM-соединения
Функция ПолучитьСтруктуруОписанияТипов()

    КвалификаторыЧисла15_2 = ПодключениеКБазе.NewObject("КвалификаторыЧисла", 15, 2);
    КвалификаторыЧисла15_3 = ПодключениеКБазе.NewObject("КвалификаторыЧисла", 15, 3);
    КвалификаторыЧисла3_0 = ПодключениеКБазе.NewObject("КвалификаторыЧисла", 3, 0);
    КвалификаторыЧисла6_0 = ПодключениеКБазе.NewObject("КвалификаторыЧисла", 6, 0); 
    КвалификаторыЧисла10_0 = ПодключениеКБазе.NewObject("КвалификаторыЧисла", 10, 0); 
    КвалификаторыЧисла10_2 = ПодключениеКБазе.NewObject("КвалификаторыЧисла", 10, 2); 
    КвалификаторыЧисла6_2 = ПодключениеКБазе.NewObject("КвалификаторыЧисла", 6, 2); 
    КвалификаторыЧисла8_2 = ПодключениеКБазе.NewObject("КвалификаторыЧисла", 8, 2); 
	
    КвалификаторыСтроки9 = ПодключениеКБазе.NewObject("КвалификаторыСтроки", 9);
    КвалификаторыСтроки150 = ПодключениеКБазе.NewObject("КвалификаторыСтроки", 150);
    КвалификаторыСтроки350 = ПодключениеКБазе.NewObject("КвалификаторыСтроки", 350);

    ОписаниеТиповЧисла15_2 = ПодключениеКБазе.NewObject("ОписаниеТипов", "Число", КвалификаторыЧисла15_2);
    ОписаниеТиповЧисла15_3 = ПодключениеКБазе.NewObject("ОписаниеТипов", "Число", КвалификаторыЧисла15_3);
    ОписаниеТиповЧисла3_0 = ПодключениеКБазе.NewObject("ОписаниеТипов", "Число", КвалификаторыЧисла3_0);
    ОписаниеТиповЧисла6_0 = ПодключениеКБазе.NewObject("ОписаниеТипов", "Число", КвалификаторыЧисла6_0);
    ОписаниеТиповЧисла10_0 = ПодключениеКБазе.NewObject("ОписаниеТипов", "Число", КвалификаторыЧисла10_0);
    ОписаниеТиповЧисла10_2 = ПодключениеКБазе.NewObject("ОписаниеТипов", "Число", КвалификаторыЧисла10_2);
    ОписаниеТиповЧисла6_2 = ПодключениеКБазе.NewObject("ОписаниеТипов", "Число", КвалификаторыЧисла6_2);
    ОписаниеТиповЧисла8_2 = ПодключениеКБазе.NewObject("ОписаниеТипов", "Число", КвалификаторыЧисла8_2);
	
    ОписаниеТиповПодразделения = ПодключениеКБазе.NewObject("ОписаниеТипов", "СправочникСсылка.ПодразделенияОрганизаций");
	
    ОписаниеТиповСтроки9 = ПодключениеКБазе.NewObject("ОписаниеТипов", "Строка", КвалификаторыСтроки9);
    ОписаниеТиповСтроки150 = ПодключениеКБазе.NewObject("ОписаниеТипов", "Строка", КвалификаторыСтроки150);
    ОписаниеТиповСтроки350 = ПодключениеКБазе.NewObject("ОписаниеТипов", "Строка", КвалификаторыСтроки350);
	
    ОписаниеТиповБулево = ПодключениеКБазе.NewObject("ОписаниеТипов", "Булево");
    ОписаниеТиповДаты = ПодключениеКБазе.NewObject("ОписаниеТипов", "Дата");

    СтруктураОписанияТипов = ПодключениеКБазе.NewObject("Структура");
	
    СтруктураОписанияТипов.Вставить("ОписаниеТиповПодразделения", ОписаниеТиповПодразделения);

    СтруктураОписанияТипов.Вставить("ОписаниеТиповЧисла15_2", ОписаниеТиповЧисла15_2);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповЧисла15_3", ОписаниеТиповЧисла15_3);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповЧисла3_0", ОписаниеТиповЧисла3_0);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповЧисла6_0", ОписаниеТиповЧисла6_0);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповЧисла10_0", ОписаниеТиповЧисла10_0);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповЧисла10_2", ОписаниеТиповЧисла10_2);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповЧисла6_2", ОписаниеТиповЧисла6_2);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповЧисла8_2", ОписаниеТиповЧисла8_2);
	
    СтруктураОписанияТипов.Вставить("ОписаниеТиповСтроки9", ОписаниеТиповСтроки9);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповСтроки150", ОписаниеТиповСтроки150);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповСтроки350", ОписаниеТиповСтроки350);
	
    СтруктураОписанияТипов.Вставить("ОписаниеТиповБулево", ОписаниеТиповБулево);
    СтруктураОписанияТипов.Вставить("ОписаниеТиповДаты", ОписаниеТиповДаты);
	
    Возврат СтруктураОписанияТипов;

КонецФункции // ПолучитьСтруктуруОписанияТипов()

 

2. Процедура "ДобавитьПоля". Благодаря наличию первой функции, код этой процедуры не меняется при использовании COM-соединения. Что довольно удобно.

Процедура ДобавитьПоля(ТаблицаСправочника)

    ТаблицаСправочника.Колонки.Добавить("КолонкаПодразделение", СтруктураОписанияТипов.ОписаниеТиповПодразделения);
    ТаблицаСправочника.Колонки.Добавить("КолонкаСотрудник", СтруктураОписанияТипов.ОписаниеТиповСотрудники);
    ТаблицаСправочника.Колонки.Добавить("КолонкаФизическоеЛицо", СтруктураОписанияТипов.ОписаниеТиповФизическиеЛица);
    ТаблицаСправочника.Колонки.Добавить("КолонкаДолжность", СтруктураОписанияТипов.ОписаниеТиповДолжности);

    ТаблицаСправочника.Колонки.Добавить("КолонкаСтрока9", СтруктураОписанияТипов.ОписаниеТиповСтроки9);
    ТаблицаСправочника.Колонки.Добавить("КолонкаСтрока150", СтруктураОписанияТипов.ОписаниеТиповСтроки150);
    ТаблицаСправочника.Колонки.Добавить("КолонкаСтрока350", СтруктураОписанияТипов.ОписаниеТиповСтроки350);

    ТаблицаСправочника.Колонки.Добавить("КолонкаЧисло15_2", СтруктураОписанияТипов.ОписаниеТиповЧисла15_2);
    ТаблицаСправочника.Колонки.Добавить("КолонкаЧисло15_3", СтруктураОписанияТипов.ОписаниеТиповЧисла15_3);
    ТаблицаСправочника.Колонки.Добавить("КолонкаЧисло3_0", СтруктураОписанияТипов.ОписаниеТиповЧисла3_0);
    ТаблицаСправочника.Колонки.Добавить("КолонкаЧисло6_0", СтруктураОписанияТипов.ОписаниеТиповЧисла6_0);
    ТаблицаСправочника.Колонки.Добавить("КолонкаЧисло10_0", СтруктураОписанияТипов.ОписаниеТиповЧисла10_0);
    ТаблицаСправочника.Колонки.Добавить("КолонкаЧисло10_2", СтруктураОписанияТипов.ОписаниеТиповЧисла10_2);
    ТаблицаСправочника.Колонки.Добавить("КолонкаЧисло6_2", СтруктураОписанияТипов.ОписаниеТиповЧисла6_2);
    ТаблицаСправочника.Колонки.Добавить("КолонкаЧисло8_2", СтруктураОписанияТипов.ОписаниеТиповЧисла8_2);

    ТаблицаСправочника.Колонки.Добавить("КолонкаБулево", СтруктураОписанияТипов.ОписаниеТиповБулево);
    ТаблицаСправочника.Колонки.Добавить("КолонкаДата", СтруктураОписанияТипов.ОписаниеТиповДаты);

КонецПроцедуры // ДобавитьПоля()

Благодаря этим двум методам, у меня "сборка" новой таблицы занимает буквально минуту. Копирую поля нужных мне типов и из запроса копирую в ДобавитьПоля сами названия полей. Пример созданной реальной таблицы для выгрузки документа "Прием на работу в организацию":

Процедура ДобавитьПоляПриемыНаРаботуРаботающие(ТаблицаСправочника)

    ТаблицаСправочника.Колонки.Добавить("Организация", СтруктураОписанияТипов.ОписаниеТиповСтроки150);
    ТаблицаСправочника.Колонки.Добавить("Сотрудник", СтруктураОписанияТипов.ОписаниеТиповСотрудники);
    ТаблицаСправочника.Колонки.Добавить("ВидЗанятости", СтруктураОписанияТипов.ОписаниеТиповСтроки150);
    ТаблицаСправочника.Колонки.Добавить("ВидДоговора", СтруктураОписанияТипов.ОписаниеТиповСтроки150);
    ТаблицаСправочника.Колонки.Добавить("ДатаПриема", СтруктураОписанияТипов.ОписаниеТиповДаты);
	
    ТаблицаСправочника.Колонки.Добавить("ФизическоеЛицо", СтруктураОписанияТипов.ОписаниеТиповФизическиеЛица);
    ТаблицаСправочника.Колонки.Добавить("ФИО", СтруктураОписанияТипов.ОписаниеТиповСтроки150);
    ТаблицаСправочника.Колонки.Добавить("ДатаРождения", СтруктураОписанияТипов.ОписаниеТиповДаты);
	
    ТаблицаСправочника.Колонки.Добавить("НомерСтроки", СтруктураОписанияТипов.ОписаниеТиповЧисла6_0);
    ТаблицаСправочника.Колонки.Добавить("ЗанимаемыхСтавок", СтруктураОписанияТипов.ОписаниеТиповЧисла6_2);
    ТаблицаСправочника.Колонки.Добавить("ИспытательныйСрок", СтруктураОписанияТипов.ОписаниеТиповЧисла6_0);

    ТаблицаСправочника.Колонки.Добавить("ДатаУвольнения", СтруктураОписанияТипов.ОписаниеТиповДаты);
    ТаблицаСправочника.Колонки.Добавить("ГрафикРаботы", СтруктураОписанияТипов.ОписаниеТиповСтроки150);
    ТаблицаСправочника.Колонки.Добавить("УсловияПриемаНаРаботу", СтруктураОписанияТипов.ОписаниеТиповСтроки150);
    ТаблицаСправочника.Колонки.Добавить("Сторно", СтруктураОписанияТипов.ОписаниеТиповБулево);
    ТаблицаСправочника.Колонки.Добавить("ТрудоваяФункция", СтруктураОписанияТипов.ОписаниеТиповСтроки150);
    ТаблицаСправочника.Колонки.Добавить("ОтразитьВТрудовойКнижке", СтруктураОписанияТипов.ОписаниеТиповБулево);

    ТаблицаСправочника.Колонки.Добавить("НомерПриказа", СтруктураОписанияТипов.ОписаниеТиповСтроки150);
    ТаблицаСправочника.Колонки.Добавить("ДатаПриказа", СтруктураОписанияТипов.ОписаниеТиповДаты);
    ТаблицаСправочника.Колонки.Добавить("ПодразделениеНаименование", СтруктураОписанияТипов.ОписаниеТиповСтроки150);
    ТаблицаСправочника.Колонки.Добавить("ПодразделениеКод", СтруктураОписанияТипов.ОписаниеТиповСтроки150);
    ТаблицаСправочника.Колонки.Добавить("Аванс", СтруктураОписанияТипов.ОписаниеТиповЧисла15_2);
    ТаблицаСправочника.Колонки.Добавить("СпособРасчетаАванса", СтруктураОписанияТипов.ОписаниеТиповСтроки150);
    ТаблицаСправочника.Колонки.Добавить("ДолжностьНаименование", СтруктураОписанияТипов.ОписаниеТиповСтроки150);
    ТаблицаСправочника.Колонки.Добавить("ДолжностьКод", СтруктураОписанияТипов.ОписаниеТиповСтроки150);

КонецПроцедуры // ДобавитьПоляПриемыНаРаботуРаботающие()

 

Этап 3. Чтение данных. Адаптация кода под работу через COM-соединение.

 

По большей части, адаптировать нужно моменты, описанные в первых двух этапах. НО! Есть и сюрпризы... Вот какие:

  • Не работает получение данных из коллекции по индексу через квадратные скобки.

Стоит отметить, что получение значения реквизита через квадратные скобки срабатывает! Примеры с комментариями:

//Получение значение реквизита по имени работает
Для Сч = 1 По ТекСтрока.КоличествоУровней Цикл
    ТекПодразделение = ТекСтрока["Уровень" + Сч + "Ссылка"];

КонецЦикла;

//По этой же теме
СтруктураТаблицКадровогоУчета[ИмяТаблицы]

//Получение данных из коллекции. 
//Как не работает:
//#1
ДатаРегистрации = ДатыРегистрации[СтрокаФизЛицо.ФизическоеЛицо];

//Как работает:
//Выручает метод Получить()
ДатаРегистрации = ДатыРегистрации.Получить(Выборка.ФизическоеЛицо);

//#2
//Работа с результатом запроса. Мы привыкли так писать:
ВыборкаВычетыНаДетей = Результат[КолРез - 1].Выбрать();

//А работает только вот так:
ВыборкаВычетыНаДетей = Результат.Получить(КолРез - 1).Выбрать();

//#3
//К первой строке коллекции привыкли обращаться вот так:
НоваяСтрока.КодВычетаЛичный = СтрокиВычетыФизлиц[0].КодВычетаЛичный;


//Правильно через метод Получить()
НоваяСтрока.КодВычетаЛичный = СтрокиВычетыФизлиц.Получить(0).КодВычетаЛичный;

 

  • Не все методы глобального контекста срабатывают. Примеры кода с комментариями:

 

//1. Проверка заполнения ссылочных типов. При этом, если значение примитивного типа и оно заполнено, 
//в результате будет Истина. Но лучше и для них добавлять ПодключениеКБазе

//Не работает
ЗначениеЗаполнено(Выборка.ГоловнаяОрганизация)

//Так правильно:
ПодключениеКБазе.ЗначениеЗаполнено(Выборка.ГоловнаяОрганизация)

//Почему-то работает вот такой код (Выборка - это COM-объект!):
Если ПодключениеКБазе.ЗначениеЗаполнено(Выборка.ДополнительныйОтпуск) И ЗначениеЗаполнено(Выборка.ДатаНачалаДоп) И ЗначениеЗаполнено(Выборка.ДатаОкончанияДоп) И Выборка.ДатаНачалаДоп <= Выборка.ДатаОкончанияДоп Тогда
    //...
КонецЕсли;

//2. Работа с примитивными типами в глобальном контексте сохраняется. Например, такой код сработает:
ИФНС = Лев(Выборка.КПП, 4);

//3. Заполнить значения свойств. 
//Несмотря на то, что обе переменные содержат только реквизиты примитивных типов данных - не заполняет ничего!

//Не работает
ЗаполнитьЗначенияСвойств(НоваяСтрокаКонтактнойИнформации, ЗначенияПолей);

//Работает
ПодключениеКБазе.ЗаполнитьЗначенияСвойств(НоваяСтрокаКонтактнойИнформации, ЗначенияПолей);

//Почему-то работает вот такое (Выборка - это COM-объект!):
ЗаполнитьЗначенияСвойств(СтрокаКонтактнойИнформации, Выборка, "ФИО, ДатаРождения");

4. Не работают привычные нам ТипЗнч() и Тип(). Ведь все привыкли проверять тип переменных вот так
//Не работает
Если ТипЗнч(ВидКонтактнойИнформации) = Тип("СправочникСсылка.ВидыКонтактнойИнформации") Тогда
    //...
КонецЕсли;

//Работает только так
Если ПодключениеКБазе.XMLТипЗнч(ВидКонтактнойИнформации).TypeName = "CatalogRef.ВидыКонтактнойИнформации" Тогда
    //...
КонецЕсли;

 

  • Обращение к предопределённым элементам также с особенностями. Не работает сравнение ссылок.

Просто получение предопределенного элемента, и добавление его в массив или список значений отлично работает:

//Предопределенные
СписокЗначений = ПодключениеКБазе.NewObject("СписокЗначений"); 
	
СписокЗначений.Добавить(ПодключениеКБазе.Справочники.ПоказателиСхемМотивации.ТарифнаяСтавкаДневная);
СписокЗначений.Добавить(ПодключениеКБазе.Справочники.ПоказателиСхемМотивации.ТарифнаяСтавкаМесячная);
СписокЗначений.Добавить(ПодключениеКБазе.Справочники.ПоказателиСхемМотивации.ТарифнаяСтавкаЧасовая); 

//Обращение к другим метаданным также работает
РеглВалюта = ПодключениеКБазе.Константы.ВалютаРегламентированногоУчета.Получить();
СправочникМенеджер = ПодключениеКБазе.Справочники.ВидыКонтактнойИнформации;

//Сравнение значений ссылочных типов, в т.ч. с предопределенными не работает!
//#Для перечислений 
//Не работающий вариант
Если ТипКонтактнойИнформации = Перечисления.ТипыКонтактнойИнформации.Адрес Тогда
    //...
КонецЕсли;

//Работающий вариант
//Т.к. сравнение идёт в рамках одной базы, можем сравнить индекс перечисления
ТипАдрес = ПодключениеКБазе.Перечисления.ТипыКонтактнойИнформации.Адрес;
Если ПодключениеКБазе.Перечисления.ТипыКонтактнойИнформации.Индекс(ТипКонтактнойИнформации) = ПодключениеКБазе.Перечисления.ТипыКонтактнойИнформации.Индекс(ТипАдрес) Тогда
    //...
КонецЕсли;

//#Для справочников
//Не работающий вариант
Если ВидКонтактнойИнформации = Справочники.ВидыКонтактнойИнформации.ФактАдресФизЛица Тогда
    //...
КонецЕсли;

//Работающий вариант
Если ПодключениеКБазе.XMLСтрока(ВидКонтактнойИнформации) = ПодключениеКБазе.XMLString(ПодключениеКБазе.Справочники.ВидыКонтактнойИнформации.ФактАдресФизЛица) Тогда
    //...
КонецЕсли;

 

  • Вызов процедур и функций из общих модулей. Пример с комментариями:
//Данный код написан на стороне базы приёмника, т.е. через COM. 
//Случайно обнаружил его в процессе написания статьи. 
//Оказалось что в УПП и ЗУП 3.1 есть и общий модуль и функция с тем же названием. 
//Т.к. параметр строковый, всё сработало
//Разложим строку в массив уровней
МассивУровней = СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПолноеНаименование, "/");
Для Сч = 0 По Уровень Цикл
    НомерРеквизита = Сч + 1;
			
    //Запишем каждый элемент в свой уровень
    НовСтрокаПодразделения["Уровень" + НомерРеквизита] = МассивУровней[Сч];
КонецЦикла; 

//Правильно вызывать так
МассивУровней = ПодключениеКБазе.СтроковыеФункцииКлиентСервер.РазложитьСтрокуВМассивПодстрок(ПолноеНаименование, "/");

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

В данном примере переменная "МассивУровней" это обычный "Массив", а не "COM-объект", поэтому квадратные скобки сработали. 

Этот пример не стал менять на работу с COM-объектом, т.к. не имеет практического смысла. Результат функции правильный.

 

  • Во многих случаях русскоязычный вариант не работает. Пока не попробуешь, не узнаешь в каких случаях нужен англоязычный вариант. Приведу примеры из моего опыта:
//ВыгрузитьКолонку() не сработало
СписокСотрудников = ТаблицаДанныхТабеля.UnloadColumn("Сотрудник");

//Процедура для выборки Сбросить()
ВыборкаПоПодразделениямУТ.Reset();

//Не сработало ТипЗнч()
ТипЗначенияПеречисления = ПодключениеКБазеЗУП.FromXMLType(ПодключениеКБазеЗУП.XMLTypeOf(ПодключениеКБазеЗУП.Перечисления.СостоянияСотрудника.ПустаяСсылка()));

 

Этап 4. Преобразование таблиц из COM-объекта в тип "ТаблицаЗначений".

 

Опишу принцип преобразования таблиц, который использую. Он состоит из 4-х шагов:

  • Создаём новую структуру без использования COM-объекта. В этой структуре создаём те же самые таблицы, с теми же названиями.
  • В цикле создаём таблицы значений через конструктор "Новый".
  • Для текущей таблицы получаем соответствие колонок. Этот этап не обязательный. Если у Вас в источнике и приёмнике поля называются одинаково, то его пропускаем. Название колонок копируем из COM-объекта.
  • Для каждой колонки теперь требуется определить какого она типа. В интернете на эту тему ничего не нашёл! Код написан методом проб и ошибок. Идея в следующем:

-- У описания типов есть массив определенных при создании колонки типов. Т.к. в моём случае тип всегда один, могу однозначно его получить.

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

-- Для определения типа значения использую простой поиск в массиве. Во всём этом было крайне тяжело сопоставить типы значений, т.к. он везде COM-объект.

-- Для более точного определения типа использую квалификаторы строки и числа.

-- Новый тип колонки через условия также получаю из заранее подготовленной структуры.

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

 

Код основной процедуры по преобразованию таблиц:

// Преобразует таблицы кадрового учета из COM-объекта в тип ТаблицаЗначений
Процедура ПреобразоватьТаблицыКадровогоУчета() Экспорт
	
    //1. Создаем новую структуру
    СтруктураТаблицКадровогоУчетаБезCOM = СоздатьСтруктуруТаблицБезCOM();
	
    //2. Создаем в цикле таблицы
    Для Каждого ТекТаблица Из СтруктураТаблицКадровогоУчета Цикл
		
        ТаблицаБезCOM = Новый ТаблицаЗначений;
		
        //3. Получаем соответствие колонок
        СоответствиеКолонок = ПолучениеСоответствиеКолонокПоТаблице(ТекТаблица.Ключ);
		
        //4. В цикле по колонкам ...
        Для Каждого ТекКолонка Из ТекТаблица.Значение.Колонки Цикл
			
            НовыйТипКолонки = Неопределено;
			
            //-- Определяем тип колонки. Длину строки и числа определяем по квалификаторам
            ТипКолонки = ТекКолонка.ValueType.Types().Получить(0);
            Если Не СтруктураОписанияТипов.ОписаниеТиповБулево.Types().Find(ТипКолонки) = Неопределено Тогда
                //Тип Булево
                НовыйТипКолонки = СтруктураОписанияТиповБезCOM.ОписаниеТиповБулево;
				
            ИначеЕсли Не СтруктураОписанияТипов.ОписаниеТиповДаты.Types().Find(ТипКолонки) = Неопределено Тогда
                //Тип Дата
                НовыйТипКолонки = СтруктураОписанияТиповБезCOM.ОписаниеТиповДаты;

            ИначеЕсли Не СтруктураОписанияТипов.ОписаниеТиповСтроки150.Types().Find(ТипКолонки) = Неопределено Тогда
                //Тип Строка
                Если ТекКолонка.ValueType.StringQualifiers.Length = 150 Тогда
                    НовыйТипКолонки = СтруктураОписанияТиповБезCOM.ОписаниеТиповСтроки150;
                ИначеЕсли ТекКолонка.ValueType.StringQualifiers.Length = 350 Тогда
                    НовыйТипКолонки = СтруктураОписанияТиповБезCOM.ОписаниеТиповСтроки350;
                ИначеЕсли ТекКолонка.ValueType.StringQualifiers.Length = 9 Тогда
                    НовыйТипКолонки = СтруктураОписанияТиповБезCOM.ОписаниеТиповСтроки9;
                КонецЕсли;
				
                //Тип строки по умолчанию
                Если НовыйТипКолонки = Неопределено Тогда
                    НовыйТипКолонки = СтруктураОписанияТиповБезCOM.ОписаниеТиповСтроки150;
                КонецЕсли;
				
            ИначеЕсли Не СтруктураОписанияТипов.ОписаниеТиповЧисла6_0.Types().Find(ТипКолонки) = Неопределено Тогда
                //Тип Число
                Если ТекКолонка.ValueType.NumberQualifiers.Digits = 15 Тогда
                    Если ТекКолонка.ValueType.NumberQualifiers.FractionDigits = 2 Тогда
                        НовыйТипКолонки = СтруктураОписанияТиповБезCOM.ОписаниеТиповЧисла15_2;
                    ИначеЕсли ТекКолонка.ValueType.NumberQualifiers.FractionDigits = 3 Тогда
                        НовыйТипКолонки = СтруктураОписанияТиповБезCOM.ОписаниеТиповЧисла15_3;
                    КонецЕсли;
                ИначеЕсли ТекКолонка.ValueType.NumberQualifiers.Digits = 3 Тогда
                    Если ТекКолонка.ValueType.NumberQualifiers.FractionDigits = 0 Тогда
                        НовыйТипКолонки = СтруктураОписанияТиповБезCOM.ОписаниеТиповЧисла3_0;
                    КонецЕсли;
                ИначеЕсли ТекКолонка.ValueType.NumberQualifiers.Digits = 6 Тогда
                    Если ТекКолонка.ValueType.NumberQualifiers.FractionDigits = 0 Тогда
                        НовыйТипКолонки = СтруктураОписанияТиповБезCOM.ОписаниеТиповЧисла6_0;
                    ИначеЕсли ТекКолонка.ValueType.NumberQualifiers.FractionDigits = 2 Тогда
                        НовыйТипКолонки = СтруктураОписанияТиповБезCOM.ОписаниеТиповЧисла6_2;
                    КонецЕсли;
                ИначеЕсли ТекКолонка.ValueType.NumberQualifiers.Digits = 10 Тогда
                    Если ТекКолонка.ValueType.NumberQualifiers.FractionDigits = 0 Тогда
                        НовыйТипКолонки = СтруктураОписанияТиповБезCOM.ОписаниеТиповЧисла10_0;
                    ИначеЕсли ТекКолонка.ValueType.NumberQualifiers.FractionDigits = 2 Тогда
                        НовыйТипКолонки = СтруктураОписанияТиповБезCOM.ОписаниеТиповЧисла10_2;
                    КонецЕсли;
                ИначеЕсли ТекКолонка.ValueType.NumberQualifiers.Digits = 8 Тогда
                    Если ТекКолонка.ValueType.NumberQualifiers.FractionDigits = 2 Тогда
                        НовыйТипКолонки = СтруктураОписанияТиповБезCOM.ОписаниеТиповЧисла8_2;
                    КонецЕсли;
                КонецЕсли;
				
                //Тип числа по умолчанию
                Если НовыйТипКолонки = Неопределено Тогда
                    НовыйТипКолонки = СтруктураОписанияТиповБезCOM.ОписаниеТиповЧисла6_0;
                КонецЕсли;
            КонецЕсли;

            //-- Получаем соответствие колонки
            НовоеНаименованиеКолонки = СоответствиеКолонок.Получить(ТекКолонка.Name);  
			
            Если Не ЗначениеЗаполнено(НовоеНаименованиеКолонки) Тогда
                Продолжить;
            КонецЕсли;
			
            //-- Создаем новую колонку
            ТаблицаБезCOM.Колонки.Добавить(НовоеНаименованиеКолонки, НовыйТипКолонки);
        КонецЦикла; 
    КонецЦикла;

КонецПроцедуры // ПреобразоватьТаблицыКадровогоУчета()

 

Код вспомогательных функций:

Функция СоздатьСтруктуруТаблицБезCOM()
	
    СтруктураТаблиц = Новый Структура;
	
    Для Каждого ТекТаблица Из СтруктураТаблицКадровогоУчета Цикл
	
        СтруктураТаблиц.Вставить(ТекТаблица.Ключ);

    КонецЦикла;
	
    Возврат СтруктураТаблиц;
	
КонецФункции // СоздатьСтруктуруТаблицБезCOM()

Функция ПолучениеСоответствиеКолонокПоТаблице(ИмяТаблицы)
	
    Если ИмяТаблицы = "" Тогда
        СоответствиеКолонок = ПолучитьСоответствиеКолонок();
    КонецЕсли;
	
    Возврат СоответствиеКолонок;	

КонецФункции // ПолучениеСоответствиеКолонокПоТаблице()

Функция ПолучитьСоответствиеКолонок()

    СоответствиеКолонок = Новый Соответствие;
	
    СоответствиеКолонок.Вставить("ИсходноеПоле1",  "НовоеПоле1");
    СоответствиеКолонок.Вставить("ИсходноеПоле2",  "НовоеПоле2");
    СоответствиеКолонок.Вставить("ИсходноеПоле3",  "НовоеПоле3");
    СоответствиеКолонок.Вставить("ИсходноеПоле4",  "НовоеПоле4");
    СоответствиеКолонок.Вставить("ИсходноеПоле5",  "НовоеПоле5");
    СоответствиеКолонок.Вставить("ИсходноеПоле6",  "НовоеПоле6");
    СоответствиеКолонок.Вставить("ИсходноеПоле7",  "НовоеПоле7");
    СоответствиеКолонок.Вставить("ИсходноеПоле8",  "НовоеПоле8");
    СоответствиеКолонок.Вставить("ИсходноеПоле9",  "НовоеПоле9");
    СоответствиеКолонок.Вставить("ИсходноеПоле10",  "НовоеПоле10");
	
    Возврат СоответствиеКолонок;
	
КонецФункции // ПолучитьСоответствиеКолонок()

 

Теперь довольно важный момент! При выборе этой технологии нужно учесть, что это не самая быстрая технология обмена данными.

Однако! Эта технология используется до сих пор во всех тиражных решениях вендора.

Я лично её выбираю за стабильность. В моём опыте не было непонятных проблем/ошибок/сбоев. 

Также ориентируюсь на то, что далеко не в каждой организации есть Web-сервер.

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

 

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

Помощник заполнения графиков при вахтовом методе работы

Отладка временных таблиц и типа ТаблицаЗначений

Чтение данных из Excel. Шаблон кода

 

Предыдущие публикации:

Как читать чужой код? Часть 4. Программный интерфейс. Исправление чужих доработок

Я - ЗУПер! Часть 1. Компетенции сотрудников. (продолжение в апреле)

Ни в ЗУП ногой!? А мне нравится! Часть 1. Главные сложности решения, что отталкивает 

См. также

SALE! 20%

Перенос данных из УПП 1.3 в ERP 2 / УТ 11 / КА 2. Переносятся документы, справочная информация и остатки

Обмен между базами 1C Платформа 1С v8.3 1С:Управление производственным предприятием 1С:ERP Управление предприятием 2 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос документов, начальных остатков и справочной информации из УПП 1.3 в ERP 2 | из УПП 1.3 в УТ 11 | из УПП в КА 2 | Правила конвертации (КД 2) в продаже с 2015 года, постоянно работаем над их развитием | Более 360 предприятий выполнили переход с использованием этого продукта! | Сэкономьте время - используйте готовое решение для перехода! | Позволяет перенести из УПП 1.3 в ERP / УТ 11 / КА 2 всю возможную информацию | В переносе есть фильтр по организации и множество других опциональных параметров выгрузки | Есть несколько алгоритмов выгрузки остатков на выбор

45650 36520 руб.

04.08.2015    159665    363    267    

345

SALE! 15%

[ED3] Обмен для ERP 2.5, КА 2.5, УТ 11.5 БП 3.0, Розница, УНФ и других с EnterpriseData (универсальный формат обмена), правила обмена

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Розница 2 1С:Управление нашей фирмой 1.6 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х 1С:Управление нашей фирмой 3.0 1С:Розница 3.0 Россия Платные (руб)

Правила в универсальном формате обмена для ERP 2.5, КА 2.5, УТ 11.5, БП 3.0, Розница, УНФ, для последних версий конфигураций. Ссылки на другие конфигурации в описании публикации. Правила совместимы со всеми другими версиями конфигураций новыми и старыми, поддерживающими обмен в формате EnterpriseData. Не требуется синхронного обновления правил после обновления другой конфигурации, участвующей в обмене. Типовой обмен через планы обмена кнопкой Синхронизация вручную или автоматически по расписанию, или вручную обработкой.

25080 22572 руб.

12.06.2017    134919    722    291    

388

SALE! 20%

Перенос данных из ERP 2 / КА 2 / УТ 11 в БП 3.0. Переносятся документы, начальные остатки и справочники

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

Перенос данных из ERP в БП 3 | из КА 2 в БП 3 | из УТ 11 в БП 3 | из ЕРП в БП 3 | В продаже с 2019г. | Воспользовались более 176 предприятий! | Сэкономьте время - используйте готовое решение для перехода! | Перенос разработан в формате КД 2 (правила конвертации данных) | Переносятся все возможные виды документов, начальных остатков и нормативно-справочная информация| Можно опционально выгружать каждую пару "номенклатура+характеристика" как отдельную номенклатуру | Есть выгрузка настроек счетов учета и зарплатных данных из ERP / КА 2 | Можно проверить на вашем сервере перед покупкой, обращайтесь!

34650 27720 руб.

15.04.2019    68413    178    138    

111

SALE! 20%

Перенос данных из ERP 2 / КА 2 в ЗУП 3. Переносятся остатки, документы и справочники

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Комплексная автоматизация 2.х 1С:Зарплата и Управление Персоналом 3.x Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из ERP в ЗУП 3 | из КА 2 в ЗУП | Воспользовались более 79 предприятий! | Предлагаем приобрести готовые правила конвертации данных (КД 2) для переноса остатков, документов с движениями и справочной информации 3 | В продаже с 2020г. | Оперативно обновляем правила до актуальных релизов 1С | Есть перенос начальной задолженности по зарплате и начальной штатной расстановки на выбранную дату | Обороты за прошлые годы (данные для расчета среднего) переносятся свернуто в документ "Перенос данных" | Есть фильтр по организациям | Документы за текущий период переносятся сразу с движениями, поэтому не потребуется делать перерасчеты | Перенос можно проверить перед покупкой, обращайтесь!

43450 34760 руб.

03.12.2020    34168    80    58    

78

SALE! 10%

Перенос данных из УТ 10.3 в УТ 11.5. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 Оперативный учет 1С:Управление торговлей 10 1С:Управление торговлей 11 Россия Управленческий учет Платные (руб)

Перенос данных из 1С:Управление торговлей 10.3 в 1С:Управление торговлей 11.5 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УТ 10.3 (10.3.87.x) и УТ 11.5 (11.5.16.x).

28000 25200 руб.

23.07.2020    46284    196    64    

157

SALE! 10%

Перенос данных из БП 3.0 в УТ 11 / КА 2 / ERP 2. Переносятся начальные остатки, документы и справочники

Обмен между базами 1C Платформа 1С v8.3 1С:ERP Управление предприятием 2 1С:Бухгалтерия 3.0 1С:Управление торговлей 11 1С:Комплексная автоматизация 2.х Россия Платные (руб)

В продаже с 2014г. | Воспользовались более 122 предприятий! | Перенос данных из БП 3.0 в УТ 11 | из БП 3.0 в КА 2 | из БП 3.0 в ERP | Сэкономьте свое время - используйте готовое решение для перехода! | Постоянно работаем над развитием переноса данных | Обновляем на новые релизы 1С | Есть фильтр выгрузки по организациям | Переносятся начальные остатки на выбранную дату, документы за период времени и вся возможная справочная информация | Перенос сделан на технологии КД 2 (правила конвертации данных)

50722 45650 руб.

31.10.2014    231389    124    327    

295

Перенос данных из Парус 10 в ЗГУ ред.3

Внешние источники данных Кадровый учет Файловый обмен (TXT, XML, DBF), FTP Обмен между базами 1C Платформа 1С v8.3 Сложные периодические расчеты 1С:Зарплата и кадры государственного учреждения 3 Государственные, бюджетные структуры Россия Бухгалтерский учет Бюджетный учет Платные (руб)

Обработка позволяет перенести кадровую информацию и данные по заработной плате, фактических удержаниях, НДФЛ, вычетах, страховых взносах из базы Парус 10 учреждений в конфигурацию 1С:Зарплата и кадры государственного учреждения ред. 3 (ЗГУ) и начать с ней работать с любого месяца года.

60000 руб.

05.10.2022    9205    9    8    

10

SALE! 10%

Перенос данных из УПП 1.3 в БП 3.0. Переносятся документы (обороты за период), справочная информация и остатки

Обмен между базами 1C Файловый обмен (TXT, XML, DBF), FTP Платформа 1С v8.3 1С:Управление производственным предприятием 1С:Бухгалтерия 3.0 Россия Бухгалтерский учет Управленческий учет Платные (руб)

Перенос данных из 1С:Управление производственным предприятием 1.3 в 1С:Бухгалтерия предприятия 3.0 с помощью правил обмена. Переносятся остатки, документы (обороты за период), справочная информация. Правила проверены на конфигурациях УПП 1.3 (1.3.223.x) и БП 3.0 (3.0.149.x). Правила подходят для версии ПРОФ и КОРП.

28000 25200 руб.

15.12.2021    20235    132    38    

90
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. PowerBoy 3350 22.02.23 09:20 Сейчас в теме
Передача таблицы значений:

стрРезультатЗапроса = COMОбъектКонектор.ЗначениеВСтрокуВнутр(ТЗДанныеCOM);
ТЗДанные = ЗначениеИзСтрокиВнутр(стрРезультатЗапроса);
корум; user700897_nkt1c; badday; Batman; Daniayr; frkbvfnjh; wonderboy; cdrw3; tormozit; starik-2005; biimmap; triviumfan; +12 Ответить
28. biimmap 1827 25.02.23 14:29 Сейчас в теме
(1)
ЗначениеВСтрокуВнутр


Было интересно, сколько голосов соберет комментарий... Поэтому ответ с задержкой.

1. Начну с простого, с описания самого метода в синтаксис-помощнике:
Примечание:
Используется для сохранения функциональной совместимости с 1С:Предприятием 7.7. Использовать для других целей не рекомендуется.

Есть рекомендация, зачем её обходить?

2. Читал статью на эту тему, и в комментариях к ней коллеги написали, что работает довольно не быстро. Сам не проверял! не интересно

3. Ещё одна ссылка, где не рекомендуют его использовать https://its.1c.ru/db/metod8dev/content/2612/hdoc/_top/%D0%B7%D0%BD%D0%B0%D1­%87%D0%B5%D0%BD%D0%B8%D0%B5%D0%B2%D1%81%D1%82%D1%80%D0%BE%D0­%BA%D1%83%D0%B2%D0%BD%D1%83%D1%82%D1%80

4. Ну и самое главное: В публикации написано, что при трансформации таблицы из COM в ТаблицаЗначений есть потребность заменить наименования колонок. Т.е. происходит сопоставление данных источника и приёмника. По этой причине данный способ совсем не подходит.

Как написал в начале публикации: мне известно о других способах обмена и о том, что данный способ устарел. Но для моей задачи он подходит идеально!
2. m_aster 111 22.02.23 10:17 Сейчас в теме
Павел, спасибо, интересно. Тоже часто слышу, что технология устарела и т.д. Один прям категорично заявлял, что все, умерла. Да, есть описание в Вики:
>>Для Windows Server 2012 R2 роль сервера приложений, которая реализует COM+, объявлена устаревшей и подлежащей удалению в будущих версиях.
Здесь говорится, что удалена и не поддерживается роль сервера, в описаниях изменений(об обновлениях, удаленных, не поддерживаемых компонентах) в версиях Windows Server на сайте Microsoft(для версий 2016, 2019, 2022) ни слова не сказано, что компонент COM+, как технология, удален, не поддерживается и т.д.
Так, что пока поживет еще. Вещь удобная, и в последних версиях(впрочем, как и раньше), например, БП 3 и ЗуП 3 именно прямое подключение стоит на первой вкладке настроек обмена для синхронизации. Настроить нужно правильно и проверять когда удобнее и оптимальнее использовать ту или технологию обмена.
3. biimmap 1827 22.02.23 10:36 Сейчас в теме
(2) Тут главное её использовать с умом всё таки. Если будут запросы, в которых по миллиону записей... и потом обработка такой таблицы, то ждать придётся долго) Но для периодической или разовой синхронизации идеальная технология.

А статья содержит подходы, которые упрощают работу за счет универсальных процедур.
5. m_aster 111 22.02.23 11:54 Сейчас в теме
(3)Павел, да, я написал в конце об этом. Вы правы и ключевая фраза - "..с умом.."). Просто говорить категорично, как я слышал не раз, что технология совсем устарела и т.д., не совсем корректно, на мой взгляд.
29. gofrom 25.02.23 21:50 Сейчас в теме
(5) Нет никакого "умного" аргумента использовать самый неэффективный способ обмена данными.
HanterVol; +1 1 Ответить
4. AllexSoft 22.02.23 10:39 Сейчас в теме
Столкнулись с такой проблемой при использовании COM: при завершении работы с COM-объектом на сервере остается висеть COM Surrogate (dllhost.exe) - видимо это коннектор через который происходит соединение. Их может накапливаться тысячи процессов. Может кто сталкивался что можно сделать?
7. m_aster 111 22.02.23 12:17 Сейчас в теме
(4)Посмотрите здесь, что такое COM Surrogate на примере Windows 10, возможно, напрямую с COM Connector не связано:
>>COM Surrogate – это базовый процесс Windows 10, который отвечает за отображение эскизов и аналогичной информации
https://generd.ru/fix/ispravit-problemy-s-com-surrogate-v-windows-10/?ysclid=lefgikjo43192653220
11. AllexSoft 22.02.23 14:35 Сейчас в теме
(7) не, точно связано с ком коннектами 1с, тестил. Открываем 100 COM коннектов, получаем 100 процессов COM Surrogate на серваке.
10. biimmap 1827 22.02.23 12:55 Сейчас в теме
(4) Вы программно разрываете соединение при закрытии обработки? В приведенном коде для подключения есть эта строка.
12. AllexSoft 22.02.23 14:37 Сейчас в теме
(10) разрываю, причем и в МойОбъект = Неопределено. И закрываю application (у нас com для работы с вордом), уже перепробовал все. Глюк платформы какой то, причем появилось такое поведение на 22ой платформе, на 20ой не было насколько я помню
13. m_aster 111 22.02.23 15:11 Сейчас в теме
(12)Сложно сказать, возможно. Обычно достаточно очистить все переменные связанные с COM от 1С присвоением Неопределено.
Для COM Office есть рекомендация на ИТС, вы вроде все это описали:
https://its.1c.ru/db/metod8dev#content:2256:hdoc
14. AllexSoft 22.02.23 15:18 Сейчас в теме
(13) спасибо за ссылку, это как минимум можно приложить к обращению в поддержку 1С.. ибо тут платформенный баг с высокой вероятностью
6. RustIG 1351 22.02.23 12:13 Сейчас в теме
(0) Павел , суть понятна. Молодец, что поделился так подробно.
Для желающих вот еще статья на подобную тему: Использование com-соединения для сопоставления номенклатуры, контрагентов
8. bulpi 215 22.02.23 12:33 Сейчас в теме
//Не работающий вариант
Если ВидКонтактнойИнформации = Справочники.ВидыКонтактнойИнформации.ФактАдресФизЛица Тогда

А вот так если :


Если ВидКонтактнойИнформации = ПодключениеКБазе.Справочники.ВидыКонтактнойИнформации.ФактАдресФизЛица Тогда
9. biimmap 1827 22.02.23 12:46 Сейчас в теме
(8) работает только как написал. У меня по крайней мере) На форумах были описаны варианты сравнения ссылок, которые добавил в эту статью.

Сравнение ссылок не происходит напрямую. Не важно ссылка на какой объект метаданных. Нужно её к чему-то простому привести, тогда можно сравнить.
15. cheshirshik 63 22.02.23 17:38 Сейчас в теме
Вставлю свои 5 копеек про СОМ. Я эту технологию вообще нигде не рекомендую использовать. Причина банальна. СОМ не работает на Линуксе.
TyurinArt; Aleskey_K; dsdred; sapervodichka; starik-2005; mondordom; biimmap; +7 3 Ответить
16. biimmap 1827 22.02.23 17:47 Сейчас в теме
(15)
СОМ не работает на Линуксе


Хорошее дополнение. Но у меня не было ни одного проекта на Линуксе. Надеюсь, и не будет!
strelec13; cheshirshik; +2 1 Ответить
17. mondordom 22.02.23 21:33 Сейчас в теме
(16)хотелось бы. Но, в свете происходящего, боюсь Linux'а в нашей жизни будет становиться все больше, а COM+, соответственно, все меньше ))
Aleskey_K; dsdred; starik-2005; +3 Ответить
19. starik-2005 3033 22.02.23 21:40 Сейчас в теме
(17)
COM
Ща рулят микросервисы и HTTP[s]ы.
wowik; HanterVol; itmind; Aleskey_K; dsdred; cheshirshik; +6 Ответить
18. starik-2005 3033 22.02.23 21:39 Сейчас в теме
(16)
Надеюсь, и не будет!
Куда ж Вы денетесь с подводной лодки )))
21. biimmap 1827 22.02.23 22:17 Сейчас в теме
(18) Посмотрим... Будем адаптироваться. Но мне всё же кажется что именно Microsoft через год другой вернётся на своё место.
22. starik-2005 3033 22.02.23 22:19 Сейчас в теме
(21)
что именно Microsoft через
Ну микрософт активно запиливает у себя WSL (уже 2-й версии. все больше ГУИ и прочего), будучи платиновым членом линух фаундейшн. А на ее облаках установка линуха давно уже превысила установки винды. Ну и мелкомягкие, такое впечатление создается, что пилят линух больше, чем свою венду.
44. m_aster 111 28.02.23 10:41 Сейчас в теме
(22)Да, все так, и облачные сервисы MS вторые после Amazon, суть в том, что Линукс крутится на машинах MS. Это рынок, ничего личного, как говорится, не можешь победить, возглавь. Линукс не плох, 10-ка тоже ничего, встала без проблем на слабой машине там, где Линукс завис (MX Linux, хороший дистрибутив, версия ahs, "Advanced Hardware Support", рассматривался как дистрибутив с поддержкой Postgres).
MS Server 2022 хорош, просто летает, даже на слабых машинах. SQL 2022 стал еще лучше.
На рынке десктопных ОС MS занимает 80%(это признает и сам Торвальдс, это очевидно), у нас этот процент еще больше - 94(статистика Яндекса, https://www.comnews.ru/content/224120/2023-01-27/2023-w04/yandeksradar-ne-razglyadel-importozamescheniya)
Если MS закрыла приобретение новых лицензий это совсем не значит, что все резко побегут обновляться на Линукс, речь не о корпоративном секторе, хотя и он не так однозначен, например, в МТС, где порядка 5 т. сотрудников, все инфраструктура крутится на MS 10 и что-то резко менять не так просто.
Возможна ситуация, когда народ забьет и перейдет на ломаные версии и разные сборки, как в начале нулевых.
Сейчас на офф. сайте можно скачать в обычном порядке средство создания носителя для установки 10-ки(неактивированная будет работать, с небольшими ограничениями). Возможно, чтобы не плодить пиратство, а возможно, чтобы не терять рынок.
Так что, что будет дальше, посмотрим.
66. cheshirshik 63 28.02.23 17:29 Сейчас в теме
(44)

А никто и не говорит, что после известных событий мы все экстренно перейдем на Линукс. Я тоже раньше плотно сидел на винде и виндовых серверах. Даже сейчас пишу сообщение на виндовой машине, но по скольку я разрабатываю самописные конфигурации на 1С, то наша фирма ориентируется на ВЕБ и на Линуксовые сервера. Почему? Цена внедрения. Посчитайте, сколько будет стоить конфигурация сервера на Линуксе и Винде. Не у всех есть деньги на покупку сервера, лицензии, и сервера СУБД.

А связка Линукс+Апач+Постгрес очень не плохо работает. Наши конфигурации на этих серверах буквально "летают".
20. cheshirshik 63 22.02.23 21:49 Сейчас в теме
(16)
Увы. Тренды сейчас другие. По скольку Майкрософт нас кинула на лицензии, то сейчас приоритет перехода на Линукс. И еще пара важных моментов:

1. Связка 1с + Линукс дешевле по лицензиям.
2. Будущее за веб технологиями, так как 1с в вебе работает хорошо на любой платформе.
23. starik-2005 3033 22.02.23 22:21 Сейчас в теме
(20)
Будущее за веб технологиями
По всей видимости продолжение 1С уйдет в сервисы, а картинки рисовать будут в браузере бравые ребята на "элементах", куда все эти модные и молодежные реакты и что там еще есть во фронтенде прикрутить можно...

Да, останется на 1С бэкэнд, превратится она в набор сервисов, которые будут собирать и обрабатывать данные фронта, отдавать обратно JSON- и protobuf-пакеты с чистыми данными. Ну и разрабы сами будут выбирать, где рендерить формы - на сервере, или на клиенте.

Так что, товарищи пенсионеры, готовьтесь к очередной смене парадигмы. Уже скоро...
dsdred; ardn; cheshirshik; Matveev_VS; +4 Ответить
24. biimmap 1827 22.02.23 23:46 Сейчас в теме
(23) Да здравствует Ванга)))
25. starik-2005 3033 23.02.23 01:17 Сейчас в теме
(24)
Ванга
В технологии «1С:Предприятие.Элемент» реализуется идеология и значительная часть архитектурных и методологических решений, принятых в платформе 1С:Предприятие. Также в технологию «1С:Предприятие.Элемент» включены различные технические и архитектурные решения, нацеленные на более эффективное использование в современных сценариях:

- работа в облаке;
- поддержка мобильных платформ;
- создание современных веб-приложений;
- асинхронность и др.
Среди особенностей технологии можно выделить следующие:

- современный пользовательский интерфейс, ориентированный в первую очередь на работу в веб и на мобильных устройствах;
- динамично развивающийся встроенный язык;
- поддержка модульности разработки;
- среда разработки, развернутая в облаке и доступная через браузер;
- ориентация на работу решений в облаке (Cloud Native) наряду с привычной возможностью локального развертывания;
Ну как-то так...
26. cheshirshik 63 23.02.23 08:35 Сейчас в теме
(23)
(24)
Подтверждаю. 1с движется в сторону укуренного джава на русском. :))) Будет бакенд и фронтенд. Правда пока все на уровне Бетта, но думаю что будет очень интересно. С нетерпением и жду развития технологии.
50. m_aster 111 28.02.23 13:28 Сейчас в теме
(23)Сергей, у Вас у самого логин Старик)). Так, что не все пенсионеры не готовы к смене парадигмы. Когда 1С перешла на управляемый интерфейс многие тоже были если не в шоке, то близко к этому)), это ж по сути другое программирование, более тонкое. И как раз старики, кто знал этот принцип разделения на клиентскую часть и серверную(по Delphi, например) спокойно все "пережевали" и чувствуют себя вполне неплохо. Так, что, посмотрим, примем все как есть, мы ж 1С любим, будем двигаться в тренде.
51. biimmap 1827 28.02.23 13:37 Сейчас в теме
(50)
у Вас у самого логин Старик))


Веселый конечно комментарий, но давай не будем обсуждать личности. Кстати вот здесь https://infostart.ru/public/1777773/
через время появится публикация про токсичные комментарии, переходы на личность и прочее
52. m_aster 111 28.02.23 13:47 Сейчас в теме
(51)Сергей, Вы не обижайтесь, простите, если задел, переходить на личности даже не думал, наоборот, хотел Вас поддержать, Вас уважаю как специалиста, Ваши публикации всегда читаю с интересом. А сказать хотел, что пенсионер пенсионеру рознь, я лично не делю по возрасту. В 90-е, когда наши немцы переезжали в Германию, рассказывали, что у них там на специалистов после 45 смотрели с предвзятостью, мол, старый уже, лучше взять молодого. А потом столкнулись с проблемой, такой, что молодежь вся пафосная, пальцы гнуть научились, а работать нет. И стали опять смотреть в сторону опыта и возраста, потому что это покладистость, знания и опыт приобретенный руками и годами. У нас сейчас похожая ситуация.
54. starik-2005 3033 28.02.23 15:08 Сейчас в теме
(52)
Сергей
Вы правда думаете, что я насадил г-на Филатова на руку и заставил его обижаться за меня? )))
58. m_aster 111 28.02.23 15:44 Сейчас в теме
(54)О чем Вы? Ничего не думаю, про Вас и Вам писал. Кстати, про токсичные комментарии, посмотрите свою риторику, переходите сходу на ты, что-то насаживаете на руку))
59. starik-2005 3033 28.02.23 15:48 Сейчас в теме
(58) Тогда поясните, на какое сообщение Вы отвечали? И на какие слова? И на какие слова Вы отвечаете сейчас?
60. biimmap 1827 28.02.23 15:50 Сейчас в теме
(59) Давай я поясню... От меня прилетело замечание в (51), он извинился сразу перед тобой не дожидаясь, пока прилетит от тебя) Всё норм!
64. m_aster 111 28.02.23 16:05 Сейчас в теме
(60)Павел,а что такого токсичного в логине "Старик"?)) Классный логин)). Сейчас вообще не понял сути Вашего коммента)). Я Вас поддерживаю со страшной силой, Павел, а Вы мне про токсичные комменты)) Конечно все норм)). Работаю, переключаюсь, ждал от Сергея, а тут Филатов))).
65. biimmap 1827 28.02.23 16:08 Сейчас в теме
(64) всё норм. неверно понял комментарий.
61. m_aster 111 28.02.23 15:54 Сейчас в теме
(59)С этого все началось - "у Вас у самого логин Старик))")). Вы ответили про переход на личности, токсичные комменты и т.д. Я ответил Вам выше в (52)), проследите цепочку, все прозрачно.
62. starik-2005 3033 28.02.23 15:54 Сейчас в теме
(61)
Вы ответили про переход на личности, токсичные комменты и т.д.
Еще раз прочитайте. Это не я писал.
53. starik-2005 3033 28.02.23 15:07 Сейчас в теме
(50)
Старик
Я "Старик" уже 25 лет, а до вдвое большего возраста я еще и ипотеку смогу отдать. "Дети, угадайте, сколько мне лет" (с) )))

ЗЫ: я про программистов 1С писал. Им придется перестраиваться под систему, которая меняется достаточно прогнозируемо. Программистам, которые интересуются другими стеками, перестраиваться будет не сильно надо - там нормальные механизмы, придуманные миллионами разрабов, а не горсткой делателей 1С.
55. biimmap 1827 28.02.23 15:10 Сейчас в теме
56. starik-2005 3033 28.02.23 15:16 Сейчас в теме
(55)
100
Ну по крайней мере со словом "дети" я точно угадал )))
m_aster; biimmap; +2 Ответить
63. m_aster 111 28.02.23 15:57 Сейчас в теме
(53)Сергей, я хорошо помню Вашу статью о Вашем жизненном пути, о детях, о семье и т.д. Вы хороший человек. А 1Сники разные есть. Есть те, что не ограничиваются только миром 1С, а изучают международный опыт, это всегда полезно. Тем более, что, думаю, и 1С не сама по себе развивается в отрыве от современных реалий. Все зависит от человека, наверное.
30. IronDain 27.02.23 07:52 Сейчас в теме
(15) Всё верно, СOM объекты не доступны через Linux, если клиент 1С запущен на ней, но виндовый клиент без проблем запускает СOM и с нормальным драйвером ODBC читает данные с левых баз данных и пишет в свою.
33. cheshirshik 63 27.02.23 11:39 Сейчас в теме
(30)

На самом деле тут вопрос не в том, работает СОМ на виндовом клиенте или нет. Вопрос в том, какое приложение ты пишешь? Универсальное, которое работает ВЕЗДЕ и на линуксе и на маке и на винде или пишешь только под винду. Вот в чем вопрос. Я сделал ставку на универсальность и считаю, что мультиплатформенность сейчас в тренде, поэтому будущее за вебом. Об этом я выше писал. Пользоваться устаревшей и медленной технологией от Майкрософт, это ваш выбор, но я считаю его не правильным.
34. biimmap 1827 27.02.23 12:00 Сейчас в теме
(33) я пишу обычную обработку по миграции данных из ЗУП 2.5/УПП в ЗУП 3.1. Алгоритмы пишутся таким образом, что можно будет не очень сложно переделать на загрузку из Excel. Сохранение в Excel идет через вот эту бесплатную обработку: https://infostart.ru/public/1777438/
35. cheshirshik 63 27.02.23 13:31 Сейчас в теме
(34)

Без обид, но я бы при такой задаче использовал бы КД 2.0.
36. biimmap 1827 27.02.23 13:52 Сейчас в теме
(35) Меня за 15 лет работы с ЗУПом задолбал этот дурацкий и непредсказуемый механизм! Тем более, что в типовых правилах заложена настолько глупая концепция, что мрак! Поэтому и решил писать с нуля. Я не люблю сидеть и ставить галочки) А так мне ессно понятно, что этим многие пользуются...

И главная задача у меня - написать так загрузку, чтоб потом легко было переделать на Excel. Это в свою очередь позволит мигрировать из любых систем. В очередной раз пишу, что в моей задаче эта технология подходит идеально.

Чтение всех данных + преобразование в обычные таблицы займёт примерно 20 минут (это для любителей скоростных переносов). Если интересно, поставь выгружаться базу типовыми правилами! Получишь несколько часов. Так что используя COM якобы устаревший мои алгоритмы работают быстрее, чем якобы модные способы.

а обижаться тут не на что. Каждому своё!
38. cheshirshik 63 27.02.23 15:34 Сейчас в теме
(36)

КД 2.0 - если копнуть немного глубже и понимать его механизмы - по сути та же обработка, которую ты пишешь, только в формате ХМЛ без СОМ (но можно и с использованием СОМ :-D). Писать правила я бы стал свои, а не использовать типовые. Мы программисты. Наша работа творческая. Если проще и быстрее сделать разовую обработку выгрузки/загрузки, ну значит лучше использовать такую обработку.

На счет миграции с любых систем, то твоя обработка не будет работать на Линуксе. Поэтому слово "любых" тут не совсем уместно. Скорее с тех, что на винде (Клиент/Сервер в зависимости от того, где она будет выполняться) .
39. biimmap 1827 27.02.23 15:43 Сейчас в теме
(38) КД совсем не моё! Кому нравится - ОК.
Я ж не даром про Excel написал!? Сохранение из табличного документа в Excel работает.

точно также работает и чтение!

Ну и в очередной раз напишу, что в моей практике это убожества ещё не было)
40. cheshirshik 63 27.02.23 15:49 Сейчас в теме
(39)

Можешь со мной не согласиться, но использование Экселя и технологии СОМ в твоей задаче - это костыли. Почему? Ну потому, что идет привязка к конкретной платформе и используется не типовой подход к решению задачи, так как есть готовые инструменты и решения от 1с для этого.

Я бы оправдал такой подход только в одном случае, когда исходная база сильно модифицирована и то... все твои подходы я бы реализовал через свои правила обмена на КД 2.0 без технологии СОМ. Но это мое ИМХО.
41. biimmap 1827 27.02.23 16:01 Сейчас в теме
(40) Если в условие задачи вписать то, что я на дух не выношу конвертацию... остальное становится более понятным.
42. biimmap 1827 27.02.23 16:09 Сейчас в теме
(40) И вот ещё один важный момент, почему не люблю конвертацию:

Она опирается на конкретный релиз! И это очень дурацкая особенность! Потому как при смене релиза, приходится переносить правила на новый релиз. А это довольно трудозатратно при таких переносах.

Написан этот комментарий не на пустом месте. На одном очень крупном проекте, где изначально был архитектором, коллега пошел через КД. Так вот уже 5-й год к ряду он постоянно дорабатывает эти правила. Казалось бы, ну и что?!

А суть в том, что данные, которые необходимо мигрировать за эти 5 лет НЕ ИЗМЕНИЛИСЬ СОВСЕМ!!! И коллега уже 5 лет делает никому не нужную работу, хоть и использует "типовые" средства. А моему "костылю", как Вы это назвали, глубоко всё равно какой релиз, для какой страны написан ЗУП, а может это вообще не ЗУП и на входе будет Excel и т.д.

И ещё один плюс моего "костыля" - это продуманная концепция на 30 листах, где чётко описано что и для чего нужно загружать. Если полистать существующие решения на эту тему, то описанной концепции они не имеют!

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

Ваша позиция ясна, надеюсь мою теперь тоже. Благодарю за аргументированный диалог!
57. m_aster 111 28.02.23 15:17 Сейчас в теме
(42)Павел, Вы все сделали правильно. Есть свои подходы у каждого исходя из оптимального использования того или иного метода, Вы поделились своим опытом, Вам спасибо!
По поводу COM и привязки к версии платформы это не проблема, а элементарный бардак, много раз видел кучу старых релизов, когда не понятно какая версия стартует в тот или иной момент, плюс еще ставят х32 и х64 вперемежку. Ставишь новую версию платформы, удаляй старье напрочь, все настройки хорошо сохраняются, зарегить COM меньше пары минут и все, все работает прекрасно. Мне COM нравится тем, что не нужны промежуточные прокладки, залезаешь напрямую в базу и цепляешь оттуда все, что нужно. Понятно, что на нагруженных системах действуют другие подходы, когда важно быстродействие и объем данных. Но категорично заявлять, что технология устарела и выкиньте ее на помойку, это больше обмен личным мнением, чем объективной реальностью.
67. cheshirshik 63 28.02.23 17:36 Сейчас в теме
(57)

А никто и не предлагал эту технологию выкидывать на помойку. Задачи разные бывают. Думаю СОМ иногда даже в них полезен. Не спорю. Речь скорее о том, что технология медленная и не универсальная.

П.с.

Мир не стоит на месте. Прогресс неизбежен. Надо быть в трендах. Использовать современные методы в программировании - это наш крест. Или будем эволюционировать или вымрем как динозавры. В прочем до сих пор есть динозавры сидящие на 1с 7й версии. :-DDD Удивительно, но факт! Есть ли будущее у таких систем? Я думаю, что нет.
68. biimmap 1827 28.02.23 17:41 Сейчас в теме
(67) тут есть комментаторы которые именно за мусорку топят!
cheshirshik; +1 Ответить
27. dsdred 3251 25.02.23 11:47 Сейчас в теме
У меня при виде статьи про Com складывается картинка:
Титаник уже налетел на айсберг, но все равно найдутся оптимисты которые говорят: -"Прорвемся".

Как говорится: "Аннушка уже разлила масло"
cheshirshik; +1 Ответить
32. SergeyTerentyev 27.02.23 10:10 Сейчас в теме
(27)вылечили выгорание? хорошо.
31. zqzq 23 27.02.23 10:09 Сейчас в теме
Пустую таблицу COM проще через запрос получать, только 1 явное обращение к внешней базе:
	ЗапросСОМ = ПодключениеКБазе.NewObject("Запрос");
	ЗапросСОМ.Текст =
	"ВЫБРАТЬ
	|	ДАТАВРЕМЯ(1, 1, 1) КАК Дата,
	|	ВЫРАЗИТЬ("""" КАК СТРОКА(30)) КАК Код
	|ГДЕ
	|	ЛОЖЬ
	|";	
	ТаблицаСОМ = ЗапросСОМ.Выполнить().Выгрузить();
Показать
37. biimmap 1827 27.02.23 14:11 Сейчас в теме
(31) Разве в моём коде происходит много обращение к базе источнику?

Может чего не понимаю в сути работы этой технологии... Мне казалось, что когда я получил COM-объект, то в этот момент я уже с ним работаю на стороне базы приёмника. А обращение выполняется там, где вызывается конструктор Новый или выполняются запросы. Также если есть обращение к перечислениям и предопределенным элементам справочников.
43. zqzq 23 28.02.23 09:28 Сейчас в теме
(37) Смысл что можно избавиться от описаний типов и всё в запросе описать и сразу получить типизированную таблицу. Меньше кода и код почти одинаковый с/без COM.
45. biimmap 1827 28.02.23 10:48 Сейчас в теме
(43) Кода гораздо больше! У меня преобразование таблиц на 70 строк примерно. А запросов будет очень много, т.к. таблиц по итогу будет больше 50. А так я тип значения изначально задал таблицам, а в момент преобразования просто считал универсальным циклом и переназначил тип
48. sergey82vladik 6 28.02.23 12:56 Сейчас в теме
(37) Так выполнение кода через КОМ происходит на стороне источника. Поэтому при на каждой строке-обращении к КОМ- объекту происходит обмен источник-приемник. Это можно оптимизировать, выполняя на стороне источника сразу пакет команд, как описано в https://infostart.ru/1c/articles/387577/
49. biimmap 1827 28.02.23 13:13 Сейчас в теме
(48) когда я делал самописную базу для табельного учета, размещал процедуры все по возможности на стороне базы источника. По сути за пару вызовов получал всё что нужно, без записи файлов. Довольно быстро срабатывает.

Идея, описанная в пункте минимизации вызовов про файлы. И здесь она мне не подходит... нужно выполнить кучу запросов, а весь код у меня в обработке. Эту (и несколько других) статью я читал до того как писать свою.
46. IronDain 28.02.23 10:59 Сейчас в теме
(33) Универсальные решения пишет вендор под любые операционные системы, разрабы же сталкиваются разными припонами самого заказчика и остается решать задачу имеющимися инструментами. На моем проекте доступ к базе источника только через ODBC. Внешние источники "криво" передают данные из-за кодировки заложенной при начале эксплуатации этой БД и только виндовые драйвера более-менее могут прочитать данные и вернуть ответ. Сам я только за кроссплатформенность и чувствую себя уверенно когда под руками есть несколько вариантов решения вопроса.
47. cheshirshik 63 28.02.23 12:01 Сейчас в теме
(46)

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

А то был у меня случай. Обработка работала 8мь часов, а когда заказчик пожаловался на время работы, программисты сказали, что это не наш код кривой, а это железо у вас слабое (при том, что как раз сервер был достаточно производительный).
69. wowik 885 10.03.23 15:10 Сейчас в теме
Старый добрый "COM". Тоже есть пара статей про это:
Как выполнить отчет на СКД через COM и получить данные отчета?
Некоторая работа с данными через COM
Уже тогда говорили что эта технология мертвая, "вчерашний день", но использование продолжается.
70. biimmap 1827 10.03.23 17:23 Сейчас в теме
(69)
Уже тогда говорили что эта технология мертвая


Есть ещё одна стадия: всё новое - это хорошо забытое старое)))
71. starik-2005 3033 14.03.23 09:04 Сейчас в теме
(69)
но использование продолжается
Ага, люди до сих пор калькуляторами пользуются - привычка. Я везде уже выпилил в пользу веб-сервисов.
ЗЫ: Есть те, кто до сих пор на несколько страниц экселя выгружают с помощью СОМ-а. Я такое не могу понять.
72. strelec13 20 20.09.23 17:45 Сейчас в теме
(71)
до сих пор на несколько страниц экселя выгружают с помощью СОМ-а. Я такое не могу понять
Может понимание простое, они по другому не умеют.
73. badday 21.03.24 06:54 Сейчас в теме
Интересный подход к переносу. Спасибо за идею.
1. Получение большого количества таблиц из базы источника. Данные получаются в основном запросами и программным интрефейсом.

Получаем данные запросом, потом из запросов (СОМ) переносим данные в типизированные таблицы (СОМ), а затем уже полученные таблицы переделываем в ссылочные (Не СОМ)?
2. Преобразование ссылочных полей в примитивные типы данных, которые можно прочитать на стороне базы приёмника.

А почему множественное число "примитивные типы" ? Ссылку разве не в строку преобразуем?
В случае не плоских таблиц как быть? Например, табличные части у справочников и документов?
74. biimmap 1827 25.03.24 21:03 Сейчас в теме
(73)
Получаем данные запросом, потом из запросов (СОМ) переносим данные в типизированные таблицы (СОМ), а затем уже полученные таблицы переделываем в ссылочные (Не СОМ)?


Да. Подробно об этом последние 2 публикации мои. В одной их них можно скачать обработку-шаблон.


(73)
Интересный подход к переносу. Спасибо за идею.


Приходите ещё)

(73)
А почему множественное число "примитивные типы"


Потому что число остается числом, дата остается датой, а булево - булевым. Всё остальное преобразовывается в строки.
75. badday 27.03.24 15:08 Сейчас в теме
(74)
Подскажите по процедуре ПодключитьсяКБазеНаСервере
Если подключение есть, то идет удаление соединение из хранилища и все? А как же подключиться к базе заново?
Если подключения нет, то сначала проверяем есть ли "подключение" в хранилище (АдресCOMСоединения) и удаляем? Почему не пользуемся тем, что в хранилище положили ранее?
76. biimmap 1827 27.03.24 16:47 Сейчас в теме
(75) Это реализован механизм отключения от другой базы той же кнопкой. Первый раз нажали - подключились, второй раз нажали - отключились
Оставьте свое сообщение