Есть база BAS UT , и есть база BAS бух CORP
В базе УТ нужно построить отчет по остаткам товаров ( бех проблем ) + создать соединение к бух базе ( она кстати SQL ) - получить тоже остатки по 281 , выгрузить их в ТЗ и потом соединить в отчете остатков UT;
Номенклатура / Склады - синхронизированы ( Код - Артикул - ШтрихКод)
1. Не не писал такое ни разу , накидайте пож пример соединения и как через объект COM пишется запрос на 281.
2. В отчете как инициализировать ТЗ с бух базы и передать его как ИсточникДанных ?
Profi_1C77 @ Сегодня, 9:48
,
щось типу цього
Функция ПодключениеВыполнено(ткошибка) Экспорт
ПодклУстановлено = Истина;
СомСоединение = Новый COMОбъект("V83.ComConnector");
СтрокаСоединения = ПутьКБазе+"Usr = """+СокрЛП(Логин)+"""; Pwd = """+СокрЛП(Пароль)+"""";
Если НЕ Серверная Тогда
СтрокаСоединения = "File = """+СокрЛП(ПутьКБазе)+"""; Usr = """+СокрЛП(Логин)+"""; Pwd = """+СокрЛП(Пароль)+"""";
КонецЕсли;
Попытка
Подключение = СомСоединение.Connect(СтрокаСоединения);
Исключение
ткошибка = ОписаниеОшибки();
Если ПустаяСтрока(ткошибка) Тогда
ткошибка = НСтр("ru='ошибка подключения';uk='помилка підключення'");
КонецЕсли;
Подключение = Неопределено;
СомСоединение = Неопределено;
ПодклУстановлено = Ложь;
КонецПопытки;
Возврат ПодклУстановлено;
КонецФункции
Запрос = Подключение.NewObject("Запрос");
После успешного соединения со сторонней базой:
ЗапросВнешнейБазы = ВнешняяБаза.NewObject("Запрос");
ЗапросВнешнейБазы.Текст = ""; //тут текст запроса, как бы он выглядел в бухгалтерии
ЗапросВнешнейБазы.УстановитьПараметр(.....);
Выборка = ЗапросВнешнейБазы.Выполнить().Выбрать();
Slon747 @ Сегодня, 11:32
,
После этого Запрос в ТЗ , и в модуле объекта отчета ПриКомпоновкеРезультата ?
Выборка - это будет COM-объект. Если Вы сделаете ТЗ = ЗапросВнешнейБазы.Выполнить().Выгрузить(), то ТЗ - ето тоже COM-объект, если я ничего не путаю. И, если это не примитивные типы, колонки будут тоже COM-объектом.
Поэтому, если Вам нужна, например, Номенклатура в Вашей Базе, нужно потом еще полученную ТЗ обработать и сопоставить её элементы элементам в Вашей Базе
Profi_1C77 @ Сегодня, 11:36
,
вам, как я понимаю, надо сравнить данные управленческого учета (УТ) с бухгалтерским (КОРП), так?
ну вот и делайте как выше написали, сперва в бухии КОРП через com-объект получаете данные из УТ и кладете их в одну таблицу значений (назовем Тз1), затем закрываем подключение и удаляем com-объект за ненадобностью, затем то же самое в УТ и результат кладете в другую таблицу (Тз2), затем сравниваете эти таблицы, перед сравнением постройте в каждой из таблиц поисковый индекс (чтоб удобнее и быстрее было искать) такого примерно вида (колонку "Ключ" добавьте)
Ключ = [код].[артикул].[штрихкод]
таблицы перед добавлением индекса сворачиваем по кодам/артикулам/штрихкодам
если как вы говорите, у вас вся номенклатура синхронизирована, то проблем быть не должно
и потом сравнение двух таблиц по этому индексу -- есть / нет
ну и результат -- в отчет
TohaMonster @ Сегодня, 12:13
,
колонки в ТЗ нужно делать примитивными типами (строка/число), т.е. код/артикул/наименование/количество/стоимость -- для сравнения остатков в двух базах будет достаточно
В Бухгалтерии КОРП можно создать webservice, опубликовать его на web-сервере, и опубликовать метод, который будет возвращать таблицу значений. Я везде, где мог, уходил от COM в пользу webservice.
Во-первых существенно быстрее устанавливается соединение.
Во-вторых запросы пишутся в родной базе, а если через COM, то приходится делать запрос в консоли запросов в одной базе, потом его переносить во вторую. Это дополнительная работа.
В-третьих, при возврате через COM приходится использовать пару функций ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр, или перегонять в JSON. С JSON проблема в том, что для обработки таблицы в запросе, она должна быть типизирована. То есть надо на стороне приемника создать таблицу, заполнить ее из JSON. Касательно 2 функций - вендор не рекомендует их использовать, о причине не знаю. А проверить получится ли работать с СериализаторXDTO через COM у меня как-то руки не дошли. В webservice, если добавите пакет XDTO https://pro1c.org.ua/redirect.php?http://v8.1c.ru/8.1/data/core, то станет доступен тип ValueTable и сможете на стороне приемника использовать СериализаторXDTO.ПрочитатьXDTO(), а на стороне источника СериализаторXDTO.ЗаписатьXDTO();
В расширение можно добавить webservice, режим совместимости 8.3.12 вроде как позволяет это сделать.
andytg @ Сегодня, 13:12
,
так я не возражаю, каждый ищет то, что ему удобнее. У меня 4 базы на Винде, которые должны обмениваться данными и все реализовано через веб-сервисы. Можно было сделать через COM, но открытие COM обычно в 5-7 раз медленнее, чем веб-сервис. И сделаны аналогичные отчеты, которые собирают данные из разных баз и удалось добиться разумных времен ожидания
andytg @ Сегодня, 15:10
,
пока простые запросы, еще терпимо, когда нужно использовать МенеджерВременныхТаблиц, то я лучше буду через сервисы делать
UmbertoVasyl`ovich @ 27.05.25, 11:30
,
Хелп.
&НаСервере
Функция ПодключениеВыполнено(ткошибка) Экспорт
ПодклУстановлено = Истина;
СомСоединение = Новый COMОбъект("V83.ComConnector");
// параметры
ПутьКБазе = "C:\BAS бух\";
Логин = "Ольга";
Пароль = "261080";
Серверная = Ложь;
Подключение = Неопределено;
СтрокаСоединения = ПутьКБазе+"Usr = """+СокрЛП(Логин)+"""; Pwd = """+СокрЛП(Пароль)+"""";
Если НЕ Серверная Тогда
СтрокаСоединения = "File = """+СокрЛП(ПутьКБазе)+"""; Usr = """+СокрЛП(Логин)+"""; Pwd = """+СокрЛП(Пароль)+"""";
КонецЕсли;
Попытка
Подключение = СомСоединение.Connect(СтрокаСоединения);
Исключение
ткошибка = ОписаниеОшибки();
Если ПустаяСтрока(ткошибка) Тогда
ткошибка = НСтр("ru='ошибка подключения';uk='помилка підключення'");
КонецЕсли;
Подключение = Неопределено;
СомСоединение = Неопределено;
ПодклУстановлено = Ложь;
КонецПопытки;
Возврат ПодклУстановлено;
КонецФункции
Vofka @ Сегодня, 12:41
,
СтрокаСоединения = File = "C:\BAS бух\"; Usr = "Ольга"; Pwd = "261080"
СомСоединение = COMОбъект
Ошибка = {ВнешнийОтчет.ОстаткиТоваровUT_BAS.МодульОбъекта(17)}: Метод об’єкта не виявлено (Connect)
может права / не установлена длл?
andytg @ Сегодня, 13:12
,
Я код потом код перенесу ""правильно" " мне важно что что б Подключение было
V7 = _V7.Connect(СтрокаСоединения);
_СтруктураCOM = Новый Структура;
_СтруктураCOM.Вставить("COMОбъект", V7);
_КонтейнерCOM = ПоместитьВоВременноеХранилище(_СтруктураCOM, Новый УникальныйИдентификатор);
andytg @ Сегодня, 13:23
,
эта зараза не регается
Regsvr32 comcntr.dll
Profi_1C77 @ Сегодня, 13:41
,
regsvr32 /i "C:\Program Files\1cv8\8.3.23.2236\bin\comcntr.dll"
так прошло
И еще вопрос
Попытка
V8BAS = СомСоединение.Connect(СтрокаСоединения);
Исключение
ткошибка = ОписаниеОшибки();
Подключение = Неопределено;
СомСоединение = Неопределено;
ПодклУстановлено = Ложь;
Возврат Неопределено;
КонецПопытки;
// получаем ТЗ из базы BAS
ТекстЗапроса = "
|ВЫБРАТЬ
| ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
| ХозрасчетныйОстатки.Субконто3 КАК Склад,
| ХозрасчетныйОстатки.КоличествоОстатокДт КАК КоличествоОстатокДт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаИтогов, Счет = &Счет, , ) КАК ХозрасчетныйОстатки
|";
ЗапросВнешнейБазы = V8BAS.NewObject("Запрос");
ЗапросВнешнейБазы.Текст = ТекстЗапроса;
// Присвоение значений переменным параметров.
ДатаИтогов = Дата(2025, 06, 03, 00, 00, 00);
V8ПланСчетов = V8BAS.NewObject("ПланыСчетов");
Счет = V8ПланСчетов.Хозрасчетный.ТоварыНаСкладе;
// Установка параметров.
ЗапросВнешнейБазы.УстановитьПараметр("ДатаИтогов", ДатаИтогов);
ЗапросВнешнейБазы.УстановитьПараметр("Счет", Счет);
//ТЗОстаткиБух = ЗапросВнешнейБазы.Выполнить().Выгрузить();
V8ПланСчетов = V8BAS.NewObject("ПланыСчетов");
V8BAS = СомСоединение.Connect(СтрокаСоединения);
// ...
V8BAS.ПланыСчетов.Хозрасчетный.ТоварыНаСкладе // или .НайтиПоКоду("281")
Profi_1C77 @ Сегодня, 15:02
,
NewObject("ПланыСчетов") - это для всего, что создается через конструктор Новый в языке 1с, например, Новый запрос, Новый Структура и так далее.
Счет = V8BAS.ПланыСчетов.Хозрасчетный.ТоварыНаСкладе;
Обращение таким должно быть
Счет = V8ПланСчетов.Хозрасчетный.ТоварыНаСкладе;
Счет = V8BAS.ПланыСчетов.Хозрасчетный.ТоварыНаСкладе;
Всем спасибо парни!
В итоге получил ТЗ которую 2 этапом засуну в отчет СКД и свяжу остатки
Код вышел примерно такой, новичкам на будущее ( это жестяк) :
&НаСервере
Функция ПолучитьТаблицуДанных(НачальнаяДата,КонечнаяДата) Экспорт
ТЗОстаткиБух = Неопределено;
СомСоединение = Новый COMОбъект("V83.ComConnector");
// параметры
ПутьКБазе = "***";
Логин = "**";
Пароль = "**";
Серверная = Ложь;
ткошибка ="";
Подключение = Неопределено;
СтрокаСоединения = ПутьКБазе+"Usr = """+СокрЛП(Логин)+"""; Pwd = """+СокрЛП(Пароль)+"""";
Если НЕ Серверная Тогда
СтрокаСоединения = "File = """+СокрЛП(ПутьКБазе)+"""; Usr = """+СокрЛП(Логин)+"""; Pwd = """+СокрЛП(Пароль)+"""";
КонецЕсли;
Попытка
V8BAS = СомСоединение.Connect(СтрокаСоединения);
Исключение
ткошибка = ОписаниеОшибки();
Подключение = Неопределено;
СомСоединение = Неопределено;
ПодклУстановлено = Ложь;
Возврат ТЗОстаткиБух;
КонецПопытки;
// получаем ТЗ из базы BAS
ТекстЗапроса = "
|ВЫБРАТЬ
| ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
| ХозрасчетныйОстатки.Субконто3 КАК Склад,
| ХозрасчетныйОстатки.КоличествоОстатокДт КАК Остаток
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаИтогов, Счет.Код = &КодСчета, , ) КАК ХозрасчетныйОстатки
|";
ЗапросВнешнейБазы = V8BAS.NewObject("Запрос");
ЗапросВнешнейБазы.Текст = ТекстЗапроса;
//// Присвоение значений переменным параметров.
//ДатаИтогов = Дата(2025, 06, 03, 00, 00, 00);
ЗапросВнешнейБазы.УстановитьПараметр("ДатаИтогов", КонечнаяДата);
ЗапросВнешнейБазы.УстановитьПараметр("КодСчета", "281");
Выборка = ЗапросВнешнейБазы.Выполнить().Выбрать();
ТЗОстаткиБух = Новый ТаблицаЗначений;
ТЗОстаткиБух.Колонки.Добавить("Наименование",ОбщегоНазначения.ОписаниеТипаСтрока(100));
ТЗОстаткиБух.Колонки.Добавить("Код",ОбщегоНазначения.ОписаниеТипаСтрока(11));
ТЗОстаткиБух.Колонки.Добавить("Склад",ОбщегоНазначения.ОписаниеТипаСтрока(50));
ТЗОстаткиБух.Колонки.Добавить("Остаток",ОбщегоНазначения.ОписаниеТипаЧисло(15,3));
Пока Выборка.Следующий() Цикл
НС = ТЗОстаткиБух.Добавить();
НС.Наименование = Выборка.Номенклатура.НаименованиеПолное;
НС.Код = Выборка.Номенклатура.Code;
НС.Склад = Выборка.Склад.Description;
НС.Остаток = Выборка.Остаток;
КонецЦикла;
Возврат ТЗОстаткиБух;
КонецФункции
// получаем ТЗ из базы BAS
ТекстЗапроса = "
|ВЫБРАТЬ
| ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
| ХозрасчетныйОстатки.Субконто3 КАК Склад,
| ХозрасчетныйОстатки.КоличествоОстатокДт КАК Остаток
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаИтогов, Счет.Код = &КодСчета, , ) КАК ХозрасчетныйОстатки
|";
// получаем ТЗ из базы BAS
ТекстЗапроса = "
|ВЫБРАТЬ
| ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто1.НаименованиеПолное КАК СТРОКА(100)) КАК Номенклатура,
| ВЫРАЗИТЬ(ХозрасчетныйОстатки.Субконто3.Наименование КАК СТРОКА(50)) КАК Склад,
| ХозрасчетныйОстатки.КоличествоОстатокДт КАК Остаток
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&ДатаИтогов, Счет.Код = &КодСчета, , ) КАК ХозрасчетныйОстатки
|";
// ну и так далее, т.е. определяем все нужные поля сразу в запросе как вам надо
ТЗОстаткиБух = ЗначениеИзСтрокиВнутр( V8BAS.ЗначениеВСтрокуВнутр(ЗапросВнешнейБазы.Выполнить().Выгрузить()));
Profi_1C77 @ Сегодня, 17:50
,
ну и дальше ставьте проверку обазательно
Если ТипЗнч(ТЗОстаткиБух ) = Тип("ТаблицаЗначений") Тогда
// потому что если в ком-базе запрос почему-то там не выполнился, то вернется пустая строка
....
Не обязательно выгружать данные в таблицу значений. Через ЗначениеВСтрокуВнутр и ЗначениеИзСтрокиВнутр можно передать и результат выполнения запроса. Выгрузка в таблицу значений довольно ресурсоемкая операция и если планируется обход полученного результата, то лучше делать это через выборку. Вполне возможно, что стоит обработать полученные данные до того, как передать их в качестве объекта в отчет СКД
Итог , склеил строковые Номенклатура ( код) - Склад - Наименование в СКД , вообщем пока задержка до 2 мин норм
Profi_1C77 @ Вчера, 22:48
,
можете ключ для "склейки" бух. данных с управленческими строить еще в запросе в com-базе и сразу выгружать готовую колонку -- будет еще быстрее, плюс аналогичный ключ в запросе по управленческим данным уже в СКД и в этом же запросе левое соединение с бух.данными -- будет все строиться за один проход в одном запросе, не?
andytg @ Сегодня, 9:41
,
и групппировки по номенклатуре с суммами в com-запрос добавьте
andytg @ Сегодня, 9:50
,
Там в скд может быть вариант с запросам к бух остаткам и без, потому так пока удобнее;
Украинский 1С форум: всё про 1С 8.3, 1С 8.2, 1С 8.1, 1С 8.0, 1С 7.7
https://pro1c.org.ua