Содержание:
2. Процедурыи функции обработки при работе в системе1С
Задача:
После загрузки данных в ЕРП из УПП в регистре сведений КЛ_СоответствиеПервичныхДокументовСУПП выяснили, что в поле «Сумма НДС» (регл) загрузились не совсем правильные значения. Это было понятно по отчету «ERP_СооответствиеДанныхБУиРегистраСуммыДокументаВВалютахУчета». Принял решение добавить в этот регистр сведений несколько полей и загрузить туда Ставка НДС, Сумма НДС и Сумма без НДС. Написал обработку, которая соединяется с Источником (УПП) по COM-соединению, синхронизируется с нужным видом документа и вытягивает поля Ставка НДС и Сумма взаиморасчетов. На основании этих данных в каждой строчке табличной части обработки рассчитывается правильные значения Ставка НДС, Сумма НДС и Сумма без НДС. И эти значения записываются в этот регистр сведений. Синхронизация происходит так: в Первичном документе в поле комментарий есть информация о виде документа в УПП его номер и дата. В алгоритме эти поля считываются и вставятся в запрос, запрос срабатывает на стороне Источника и данные передаются в Приемник (ЕРП). Загружаются в табличную часть обработки с сопоставлением с Первичными документами, которые уже были загружены заранее другими обработками.
Разберем принцип работы на примере выгрузки/загрузки вида документа «Поступление товаров и услуг». В форме документа есть кнопки по видам документов как они называются в УПП. А в ЕРП они попадают как единый документ с видом «Первичный документ». После нажатия кнопки «Поступление товаров и услуг» срабатывает функция ЗаполнитьТаблицуНаСервереОбщий которая заполняет табличную часть обработки данными из регистра сведений КЛ_СоответствиеПервичныхДокументовСУПП с отбором по виду документа «Поступление товаров и услуг» и возвращает количество документов данного вида КолПервичныйДокумент.
Если КолПервичныйДокумент больше 0 то при включенном флаге ЗаполнитьДокументыИзУПП происходит подключение по COM-соединению. Подключение реализовано в общем модуле.
Расш1_КешКлиент в функции в экспортной функции ПолучитьКомСоединение используя механизм Повторное использование возвращаемых значении на время сеанса. Чтоб каждой раз не происходило подключение по COM-соединению и не тратилось на это время.
Функция ПолучитьТекстЗапросаПоВидуДокумента(ВидДокумента) получает текст запроса в зависимости от параметра вида документа потом этот текст запроса передается процедуре ПодключениеПоСОМпоДокументам. В этой процедуре после подключение по COM-соединению происходит группировка данных полученных их УПП создание массив структур и передача этого массива процедуре ПодключениеПоСОМНаСервере. Здесь происходит синхронизация данных полученных из УПП с данными ЕРП. Проставляется Ставка НДС, вычисляются Сумма НДС и Сумма без НДС. По кнопке «Показать не синхронизированные строки» можно смотреть количество не синхронизированных строк. По кнопке «Дозаполнение основного регистра» с установленным флагом «Сделать запись» производится запись новых данных в регистр сведения СоответствиеПервичныхДокументовСУПП.
Остальные виды документов аналогично синхронизируем и данные записываем в регистр.
Те документы, где в комментарии нет данных или не получилось синхронизировать, исправляем
Ставка НДС, Сумма НДС и Сумма без НДС вручную.
1. Внешний вид обработки 1С
К л соответствие первичных документов СУПП исправление сумм
2. Процедуры и функции обработки при работе в системе 1С
&НаСервере
Функция ЗаполнитьТаблицуНаСервереОбщий(ВидДокумента)
ВидДокументаУПП = ПолучитьВидДокументаУПП(ВидДокумента);
Если ВидДокументаУПП = Неопределено Тогда
Возврат 0;
КонецЕсли;
ТаблицаРезультат.Очистить();
Запрос = Новый Запрос;
ТекстЗапроса =
"ВЫБРАТЬ
| КЛ_СоответствиеПервичныхДокументовСУПП.ДокументВУПП КАК ДокументВУПП,
| КЛ_СоответствиеПервичныхДокументовСУПП.Организация КАК Организация,
| КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Контрагент КАК Контрагент,
| КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Договор КАК Договор,
| КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Дата КАК Дата,
| КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Номер КАК Номер,
| КЛ_СоответствиеПервичныхДокументовСУПП.ДокументВводаОстатков КАК ДокументВводаОстатков,
| КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент КАК ПервичныйДокумент,
| КЛ_СоответствиеПервичныхДокументовСУПП.СуммаОстатокВУПП КАК СуммаОстатокВУПП,
| КЛ_СоответствиеПервичныхДокументовСУПП.СуммаОстатковНДСВУПП КАК СуммаОстатковНДСВУПП,
| КЛ_СоответствиеПервичныхДокументовСУПП.СуммаОстатокПоБухУчету КАК СуммаОстатокПоБухУчету,
| КЛ_СоответствиеПервичныхДокументовСУПП.СуммаВзаиморасчетов КАК СуммаВзаиморасчетов,
| КЛ_СоответствиеПервичныхДокументовСУПП.СуммаНДСВзаиморасчетов КАК СуммаНДСВзаиморасчетов,
| КЛ_СоответствиеПервичныхДокументовСУПП.СуммаБезНДСРегл КАК СуммаБезНДСРегл,
| КЛ_СоответствиеПервичныхДокументовСУПП.СуммаНДСРегл КАК СуммаНДСРегл,
| КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.СуммаДокумента КАК СуммаДокумента,
| КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Валюта КАК Валюта,
| КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий КАК Комментарий,
| КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.ТипПервичногоДокумента КАК ТипПервичногоДокумента,
| КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.НомерВходящегоДокумента КАК НомерВходящегоДокумента,
| КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.ДатаВходящегоДокумента КАК ДатаВходящегоДокумента,
| КЛ_СоответствиеПервичныхДокументовСУПП.Синхронизирован КАК Синхронизирован,
| ЕСТЬNULL(КурсыВалютСрезПоследних.Курс, 0) КАК КурсВалюты,
| ПТ_СведенияОДоговоре.ВидДоговора.ПТ_ТипДоговораУПП КАК ТипДоговораУПП
|ПОМЕСТИТЬ втДанные
|ИЗ
| РегистрСведений.КЛ_СоответствиеПервичныхДокументовСУПП КАК КЛ_СоответствиеПервичныхДокументовСУПП
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют.СрезПоследних(&ДатаВводаОстатков, ) КАК КурсыВалютСрезПоследних
| ПО (КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Валюта = КурсыВалютСрезПоследних.Валюта)
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.ПТ_СведенияОДоговоре КАК ПТ_СведенияОДоговоре
| ПО КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Договор = ПТ_СведенияОДоговоре.Договор
|ГДЕ
| КЛ_СоответствиеПервичныхДокументовСУПП.Организация = &Организация
| И ВЫБОР
| КОГДА &ТолькоВыбранныйВводОстатковВзаиморасчетов
| ТОГДА КЛ_СоответствиеПервичныхДокументовСУПП.ДокументВводаОстатков = &ДокументВводаОстатков
| ИНАЧЕ ИСТИНА
| КОНЕЦ
|###
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втДанные.ДокументВводаОстатков КАК ДокументВводаОстатков,
| втДанные.ПервичныйДокумент КАК ПервичныйДокумент,
| втДанные.ТипПервичногоДокумента КАК ТипПервичногоДокумента,
| втДанные.Комментарий КАК Комментарий,
| втДанные.Дата КАК Дата,
| втДанные.Номер КАК Номер,
| втДанные.Организация КАК Организация,
| втДанные.Контрагент КАК Контрагент,
| втДанные.Валюта КАК Валюта,
| втДанные.СуммаОстатокПоБухУчету КАК СуммаОстатокПоБухУчету,
| втДанные.СуммаВзаиморасчетов КАК СуммаВзаиморасчетов,
| втДанные.СуммаДокумента КАК СуммаДокумента,
| втДанные.СуммаБезНДСРегл КАК СуммаБезНДСРегл,
| втДанные.СуммаНДСРегл КАК СуммаНДСРегл,
| втДанные.КурсВалюты КАК КурсВалюты,
| втДанные.СуммаДокумента * втДанные.КурсВалюты КАК СуммаВзаиморасчетовРасчетная,
| ВЫБОР
| КОГДА втДанные.СуммаДокумента * втДанные.КурсВалюты = втДанные.СуммаВзаиморасчетов
| ТОГДА ИСТИНА
| ИНАЧЕ ЛОЖЬ
| КОНЕЦ КАК СуммаВзаиморасчетовРавны,
| втДанные.ТипДоговораУПП КАК ТипДоговораУПП
|ИЗ
| втДанные КАК втДанные
|
|ГДЕ
| ВЫБОР
| КОГДА &ВариантСинхронизиции = 1
| ТОГДА ИСТИНА
| КОГДА &ВариантСинхронизиции = 2
| ТОГДА втДанные.Синхронизирован = ИСТИНА
| КОГДА &ВариантСинхронизиции = 3
| ТОГДА втДанные.Синхронизирован = ЛОЖЬ
| КОНЕЦ
|
|УПОРЯДОЧИТЬ ПО
| ДокументВводаОстатков,
| Контрагент,
| ПервичныйДокумент
|ИТОГИ
| СУММА(СуммаОстатокПоБухУчету),
| СУММА(СуммаВзаиморасчетов),
| СУММА(СуммаДокумента),
| МАКСИМУМ(КурсВалюты),
| СУММА(СуммаВзаиморасчетовРасчетная),
| МАКСИМУМ(СуммаВзаиморасчетовРавны)
|ПО
| ДокументВводаОстатков
|АВТОУПОРЯДОЧИВАНИЕ";
ДокументВводаОстатков = ВводОстатковВзаиморасчетов;
Запрос.УстановитьПараметр("ДокументВводаОстатков", ДокументВводаОстатков);
Запрос.УстановитьПараметр("Организация", Организация);
Запрос.УстановитьПараметр("ДатаВводаОстатков", Дата(2023, 12, 31, 23, 59, 59));
Запрос.УстановитьПараметр("ТолькоВыбранныйВводОстатковВзаиморасчетов", ТолькоВыбранныйВводОстатковВзаиморасчетов);
Запрос.УстановитьПараметр("ВариантСинхронизиции", ВариантСинхронизиции);
Если ВидДокумента = "ПоступлениеТоваровИУслуг" Тогда
ДопУсловие = "И (ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 27) = ""Поступление товаров и услуг""
|ИЛИ ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 11) = ""Т0000003546""
|ИЛИ ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 43) = ""копия документа для ввода остатков по 76.06"")";
ИначеЕсли ВидДокумента = "ПоступлениеНМА" Тогда
ДопУсловие = "И ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 15) = ""Поступление НМА""";
ИначеЕсли ВидДокумента = "ПередачаОС" Тогда
ДопУсловие = "И ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 11) = ""Передача ОС""";
ИначеЕсли ВидДокумента = "АктОбмера" Тогда
ДопУсловие = "И ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 10) = ""Акт обмера""";
ИначеЕсли ВидДокумента = "РеализацияТоваровИУслуг" Тогда
ДопУсловие = "И ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 26) = ""Реализация товаров и услуг""";
ИначеЕсли ВидДокумента = "АктОбОказанииПроизводственныхУслуг" Тогда
ДопУсловие = "И ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 38) = ""Акт об оказании производственных услуг""";
ИначеЕсли ВидДокумента = "ОтчетКомитентуОПокупках" Тогда
ДопУсловие = "И ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 28) = ""Отчет комитенту (принципалу)""";
ИначеЕсли ВидДокумента = "ПлатежноеПоручениеИсходящее" Тогда
ДопУсловие = "И ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 29) = ""Платежное поручение исходящее""";
ИначеЕсли ВидДокумента = "ПлатежныйОрдерСписаниеДенежныхСредств" Тогда
ДопУсловие = "И ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 44) = ""Платежный ордер на списание денежных средств""";
ИначеЕсли ВидДокумента = "ПоступлениеДопРасходов" Тогда
ДопУсловие = "И ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 25) = ""Поступление доп. расходов""";
ИначеЕсли ВидДокумента = "ПлатежноеПоручениеВходящее" Тогда
ДопУсловие = "И ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 28) = ""Платежное поручение входящее""";
ИначеЕсли ВидДокумента = "КорректировкаДолга" Тогда
ДопУсловие = "И ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 19) = ""Корректировка долга""";
ИначеЕсли ВидДокумента = "ПлатежноеТребованиеПолученное" Тогда
ДопУсловие = "И ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 31) = ""Платежное требование полученное""";
ИначеЕсли ВидДокумента = "ПолучениеУслугПоПереработке" Тогда
ДопУсловие = "И ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 30) = ""Получение услуг по переработке""";
ИначеЕсли ВидДокумента = "ПлатежныйОрдерПоступлениеДенежныхСредств" Тогда
ДопУсловие = "И ПОДСТРОКА(КЛ_СоответствиеПервичныхДокументовСУПП.ПервичныйДокумент.Комментарий, 1, 47) = ""Платежный ордер на поступление денежных средств""";
Иначе
Возврат 0;
КонецЕсли;
ТекстЗапроса = СтрЗаменить(ТекстЗапроса, "###", ДопУсловие);
Запрос.Текст = ТекстЗапроса;
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДокументВводаОстатков = РезультатЗапроса.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
К = 0;
КолДок = 0;
КолПервичныйДокумент = 0;
МассивВходящихДанных = Новый Массив;
Пока ВыборкаДокументВводаОстатков.Следующий() Цикл
ВыборкаПервичныйДокумент = ВыборкаДокументВводаОстатков.Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам);
ДокументВводаОстатков = ВыборкаДокументВводаОстатков.ДокументВводаОстатков;
Если Не ЗначениеЗаполнено(ДокументВводаОстатков) Тогда
Продолжить;
КонецЕсли;
//Сообщить("ДокументВводаОстатков = " + ДокументВводаОстатков);
КолДок = КолДок + 1;
Пока ВыборкаПервичныйДокумент.Следующий() Цикл
ПервичныйДокумент = ВыборкаПервичныйДокумент.ПервичныйДокумент;
НоваяСтрока = ТаблицаРезультат.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ВыборкаПервичныйДокумент);
Если ВыборкаПервичныйДокумент.ТипДоговораУПП = Перечисления.ПТ_ТипыДоговоровУПП.ЗаймыКредиты Тогда
НоваяСтрока.СтавкаНДСизУПП = "БезНДС";
КонецЕсли;
СтруктураВходящихДанных = Новый Структура;
СтруктураВходящихДанных.Вставить("ПервичныйДокумент", ПервичныйДокумент);
СтруктураВходящихДанных.Вставить("ТипПервичногоДокумента", ВыборкаПервичныйДокумент.ТипПервичногоДокумента);
СтруктураВходящихДанных.Вставить("Комментарий", ВыборкаПервичныйДокумент.Комментарий);
МассивВходящихДанных.Добавить(СтруктураВходящихДанных);
К = К + 1;
КолПервичныйДокумент = КолПервичныйДокумент + 1;
НоваяСтрока.НомерСтроки = КолПервичныйДокумент;
КонецЦикла;
Если КолДок >= 5 Тогда
// Прервать;
КонецЕсли;
КонецЦикла;
Если МассивВходящихДанных.Количество() > 0 Тогда
ДанныеДокумента = ПолучитьДанныеДокумента(МассивВходящихДанных);
Для каждого стр Из ДанныеДокумента Цикл
СтруктураПоиска = Новый Структура;
Если стр.Комментарий = "копия документа для ввода остатков по 76.06" Тогда
СтруктураПоиска.Вставить("Комментарий", стр.Комментарий);
СтруктураПоиска.Вставить("Номер", стр.НомерИзКомментарий);
Иначе
СтруктураПоиска.Вставить("Комментарий", стр.Комментарий);
КонецЕсли;
МассивСтрок = ТаблицаРезультат.НайтиСтроки(СтруктураПоиска);
ТекСтрока = МассивСтрок[0];
ТекСтрока.ВидДокументаУПП = стр.ВидДокументаУПП;
ТекСтрока.НомерИзКомментарий = стр.НомерИзКомментарий;
ТекСтрока.ДатаИзКомментарий = стр.ДатаИзКомментарий;
КонецЦикла;
КонецЕсли;
Сообщить("КолПервичныйДокумент = " + КолПервичныйДокумент);
Возврат КолПервичныйДокумент;
КонецФункции
&НаКлиенте
Процедура ПоступлениеТоваровИУслуг(Команда)
ПолучениеДанныхПоВидуДокумента("ПоступлениеТоваровИУслуг");
КонецПроцедуры
&НаКлиенте
Процедура ПоступлениеНМА(Команда)
ПолучениеДанныхПоВидуДокумента("ПоступлениеНМА");
КонецПроцедуры
&НаКлиенте
Процедура ПередачаОС(Команда)
ПолучениеДанныхПоВидуДокумента("ПередачаОС");
КонецПроцедуры
&НаКлиенте
Процедура АктОбмера(Команда)
ПолучениеДанныхПоВидуДокумента("АктОбмера");
КонецПроцедуры
&НаКлиенте
Процедура РеализацияТоваровИУслуг(Команда)
ПолучениеДанныхПоВидуДокумента("РеализацияТоваровИУслуг");
КонецПроцедуры
&НаКлиенте
Процедура ПолучениеДанныхПоВидуДокумента(ВидДокумента)
КолПервичныйДокумент = ЗаполнитьТаблицуНаСервереОбщий(ВидДокумента);
Если КолПервичныйДокумент = 0 Тогда
//Сообщить("Не найден значение " + ВидДокумента + " перечиления КЛ_ВидыДокументовУПП");
Возврат;
КонецЕсли;
Если ЗаполнитьДокументыИзУПП Тогда
ТекстЗапроса = ПолучитьТекстЗапросаПоВидуДокумента(ВидДокумента);
ПодключениеПоСОМпоДокументам(ТекстЗапроса);
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Функция ПолучитьТекстЗапросаПоВидуДокумента(ВидДокумента)
Если ВидДокумента = "ПоступлениеТоваровИУслуг" Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Данные.Ссылка КАК Документ,
| Данные.Ссылка.СуммаДокумента КАК СуммаДокумента,
| Данные.СуммаНДС КАК СуммаНДС,
| Данные.СтавкаНДС КАК СтавкаНДС,
| ""Поступление товаров и услуг"" КАК ВидДокумента
|ПОМЕСТИТЬ втДанные
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Товары КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Данные.Ссылка,
| Данные.Ссылка.СуммаДокумента,
| Данные.СуммаНДС,
| Данные.СтавкаНДС,
| ""Поступление товаров и услуг""
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Услуги КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Данные.Ссылка,
| Данные.Ссылка.СуммаДокумента,
| Данные.СуммаНДС,
| Данные.СтавкаНДС,
| ""Поступление товаров и услуг""
|ИЗ
| Документ.ПоступлениеТоваровУслуг.Оборудование КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Данные.Ссылка,
| Данные.Ссылка.СуммаДокумента,
| Данные.СуммаНДС,
| Данные.СтавкаНДС,
| ""Поступление товаров и услуг""
|ИЗ
| Документ.ПоступлениеТоваровУслуг.ТоварыВРознице КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод";
ИначеЕсли ВидДокумента = "РеализацияТоваровИУслуг" Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Данные.Ссылка КАК Документ,
| Данные.Ссылка.СуммаДокумента КАК СуммаДокумента,
| Данные.СуммаНДС КАК СуммаНДС,
| Данные.СтавкаНДС КАК СтавкаНДС,
| ""Реализация товаров и услуг"" КАК ВидДокумента
|ПОМЕСТИТЬ втДанные
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Данные.Ссылка,
| Данные.Ссылка.СуммаДокумента,
| Данные.СуммаНДС,
| Данные.СтавкаНДС,
| ""Реализация товаров и услуг""
|ИЗ
| Документ.РеализацияТоваровУслуг.Услуги КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Данные.Ссылка,
| Данные.Ссылка.СуммаДокумента,
| Данные.СуммаНДС,
| Данные.СтавкаНДС,
| ""Реализация товаров и услуг""
|ИЗ
| Документ.РеализацияТоваровУслуг.ТоварыВРознице КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Данные.Ссылка,
| Данные.Ссылка.СуммаДокумента,
| Данные.СуммаНДС,
| Данные.СтавкаНДС,
| ""Реализация товаров и услуг""
|ИЗ
| Документ.РеализацияТоваровУслуг.ОбъектыСтроительства КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод";
ИначеЕсли ВидДокумента = "ПередачаОС" Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Данные.Ссылка КАК Документ,
| Данные.Ссылка.СуммаДокумента КАК СуммаДокумента,
| Данные.СуммаНДС КАК СуммаНДС,
| Данные.СтавкаНДС КАК СтавкаНДС,
| ""Передача ОС"" КАК ВидДокумента
|ПОМЕСТИТЬ втДанные
|ИЗ
| Документ.ПередачаОС.ОС КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод";
ИначеЕсли ВидДокумента = "АктОбмера" Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Данные.Ссылка КАК Документ,
| Данные.Ссылка.СуммаДокумента КАК СуммаДокумента,
| Данные.СуммаНДС КАК СуммаНДС,
| Данные.СтавкаНДС КАК СтавкаНДС,
| ""Акт обмера"" КАК ВидДокумента
|ПОМЕСТИТЬ втДанные
|ИЗ
| Документ.АктОбмера.Услуги КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод";
ИначеЕсли ВидДокумента = "АктОбОказанииПроизводственныхУслуг" Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Данные.Ссылка КАК Документ,
| Данные.Ссылка.СуммаДокумента КАК СуммаДокумента,
| Данные.СуммаНДС КАК СуммаНДС,
| Данные.СтавкаНДС КАК СтавкаНДС,
| ""Акт об оказании производственных услуг"" КАК ВидДокумента
|ПОМЕСТИТЬ втДанные
|ИЗ
| Документ.АктОбОказанииПроизводственныхУслуг.Услуги КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод";
ИначеЕсли ВидДокумента = "ПоступлениеНМА" Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Данные.Ссылка КАК Документ,
| Данные.Ссылка.СуммаДокумента КАК СуммаДокумента,
| Данные.СуммаНДС КАК СуммаНДС,
| Данные.СтавкаНДС КАК СтавкаНДС,
| ""Поступление НМА"" КАК ВидДокумента
|ПОМЕСТИТЬ втДанные
|ИЗ
| Документ.ПоступлениеНМА.НематериальныеАктивы КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод";
ИначеЕсли ВидДокумента = "ОтчетКомитентуОПокупках" Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Данные.Ссылка КАК Документ,
| Данные.Ссылка.СуммаДокумента КАК СуммаДокумента,
| Данные.СуммаНДС КАК СуммаНДС,
| Данные.СтавкаНДС КАК СтавкаНДС,
| ""Отчет комитенту (принципалу)"" КАК ВидДокумента
|ПОМЕСТИТЬ втДанные
|ИЗ
| Документ.ОтчетКомитентуОПокупках.Товары КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод";
ИначеЕсли ВидДокумента = "ПлатежноеПоручениеИсходящее" Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Данные.Ссылка КАК Документ,
| Данные.Ссылка.СуммаДокумента КАК СуммаДокумента,
| Данные.СуммаНДС КАК СуммаНДС,
| Данные.СтавкаНДС КАК СтавкаНДС,
| ""Платежное поручение исходящее"" КАК ВидДокумента
|ПОМЕСТИТЬ втДанные
|ИЗ
| Документ.ПлатежноеПоручениеИсходящее.РасшифровкаПлатежа КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод";
ИначеЕсли ВидДокумента = "ПлатежныйОрдерСписаниеДенежныхСредств" Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Данные.Ссылка КАК Документ,
| Данные.Ссылка.СуммаДокумента КАК СуммаДокумента,
| Данные.СуммаНДС КАК СуммаНДС,
| Данные.СтавкаНДС КАК СтавкаНДС,
| ""Платежный ордер на списание денежных средств"" КАК ВидДокумента
|ПОМЕСТИТЬ втДанные
|ИЗ
| Документ.ПлатежныйОрдерСписаниеДенежныхСредств.РасшифровкаПлатежа КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод";
ИначеЕсли ВидДокумента = "ПоступлениеДопРасходов" Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Данные.Ссылка КАК Документ,
| Данные.Ссылка.СуммаДокумента КАК СуммаДокумента,
| Данные.СуммаНДС КАК СуммаНДС,
| Данные.Ссылка.СтавкаНДС КАК СтавкаНДС,
| ""Поступление доп. расходов"" КАК ВидДокумента
|ПОМЕСТИТЬ втДанные
|ИЗ
| Документ.ПоступлениеДопРасходов.Товары КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Данные.Ссылка,
| Данные.Ссылка.СуммаДокумента,
| Данные.СуммаНДС,
| Данные.Ссылка.СтавкаНДС,
| ""Поступление доп. расходов""
|ИЗ
| Документ.ПоступлениеДопРасходов.Оборудование КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод";
ИначеЕсли ВидДокумента = "ПлатежноеПоручениеВходящее" Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Данные.Ссылка КАК Документ,
| Данные.Ссылка.СуммаДокумента КАК СуммаДокумента,
| Данные.СуммаНДС КАК СуммаНДС,
| Данные.СтавкаНДС КАК СтавкаНДС,
| ""Платежное поручение входящее"" КАК ВидДокумента
|ПОМЕСТИТЬ втДанные
|ИЗ
| Документ.ПлатежноеПоручениеВходящее.РасшифровкаПлатежа КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод";
ИначеЕсли ВидДокумента = "КорректировкаДолга" Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Данные.Ссылка КАК Документ,
| Данные.Сумма КАК СуммаДокумента,
| Данные.ДокументРасчетовСКонтрагентом.УчитыватьНДС КАК УчитыватьНДС,
| ВЫБОР
| КОГДА Данные.ДокументРасчетовСКонтрагентом.УчитыватьНДС
| ТОГДА ВЫБОР
| КОГДА Данные.Ссылка.Дата < ДАТАВРЕМЯ(2019, 1, 1)
| ТОГДА 18
| ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20)
| КОНЕЦ
| ИНАЧЕ ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.БезНДС)
| КОНЕЦ КАК СтавкаНДС
|ПОМЕСТИТЬ втДокумент
|ИЗ
| Документ.КорректировкаДолга.СуммыДолга КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод
|;
|
////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втДокумент.Документ КАК Документ,
| втДокумент.СуммаДокумента КАК СуммаДокумента,
| ВЫБОР
| КОГДА втДокумент.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.БезНДС)
| ТОГДА 0
| КОГДА втДокумент.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20)
| ТОГДА втДокумент.СуммаДокумента * 20 / 120
| КОГДА втДокумент.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС18)
| ТОГДА втДокумент.СуммаДокумента * 18 / 118
| КОНЕЦ КАК СуммаНДС,
| втДокумент.СтавкаНДС КАК СтавкаНДС,
| ""Корректировка долга"" КАК ВидДокумента
|ПОМЕСТИТЬ втДанные
|ИЗ
| втДокумент КАК втДокумент";
ИначеЕсли ВидДокумента = "ПлатежноеТребованиеПолученное" Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Данные.Ссылка КАК Документ,
| Данные.СуммаПлатежа КАК СуммаДокумента,
| Данные.СуммаНДС КАК СуммаНДС,
| Данные.СтавкаНДС КАК СтавкаНДС,
| ""Платежное требование полученное"" КАК ВидДокумента
|ПОМЕСТИТЬ втДанные
|ИЗ
| Документ.ПлатежноеТребованиеПолученное.РасшифровкаПлатежа КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод";
ИначеЕсли ВидДокумента = "ПолучениеУслугПоПереработке" Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Данные.Ссылка КАК Документ,
| Данные.Ссылка.СуммаДокумента КАК СуммаДокумента,
| Данные.СуммаНДС КАК СуммаНДС,
| Данные.СтавкаНДС КАК СтавкаНДС,
| ""Получение услуг по переработке"" КАК ВидДокумента
|ПОМЕСТИТЬ втДанные
|ИЗ
| Документ.ПолучениеУслугПоПереработке.Товары КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| Данные.Ссылка КАК Документ,
| Данные.Ссылка.СуммаДокумента,
| Данные.СуммаНДС КАК СуммаНДС,
| Данные.СтавкаНДС КАК СтавкаНДС,
| ""Получение услуг по переработке""
|ИЗ
| Документ.ПолучениеУслугПоПереработке.Услуги КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод";
ИначеЕсли ВидДокумента = "ПлатежныйОрдерПоступлениеДенежныхСредств" Тогда
ТекстЗапроса =
"ВЫБРАТЬ
| Данные.Ссылка КАК Документ,
| Данные.Ссылка.СуммаДокумента,
| Данные.СуммаНДС КАК СуммаНДС,
| Данные.СтавкаНДС КАК СтавкаНДС,
| ""Платежный ордер на поступление денежных средств"" КАК ВидДокумента
|ПОМЕСТИТЬ втДанные
|ИЗ
| Документ.ПлатежныйОрдерПоступлениеДенежныхСредств.РасшифровкаПлатежа КАК Данные
|ГДЕ
| Данные.Ссылка.Дата МЕЖДУ &Дата1 И &Дата2
| И Данные.Ссылка.Организация.Код = &ОрганизацияКод";
Иначе
ТекстЗапроса = Неопределено;
КонецЕсли;
Возврат ТекстЗапроса;
КонецФункции
&НаКлиенте
Процедура ПодключениеПоСОМпоДокументам(ТекстЗапроса)
Если ТекстЗапроса = Неопределено Тогда
Сообщить("Не задан ТекстЗапроса!");
Возврат;
КонецЕсли;
Соединение = Расш1_КешКлиент.ПолучитьКомСоединение();
Если Соединение = Неопределено Тогда
Сообщить("Ошибка подключения!");
Возврат;
КонецЕсли;
МассивДокументы = Новый Массив;
Запрос = Соединение.NewObject("Запрос");
ТекстЗапроса = ТекстЗапроса + ";" + "
|ВЫБРАТЬ
| втДанные.Документ,
| втДанные.СтавкаНДС,
| МАКСИМУМ(втДанные.СуммаДокумента) КАК СуммаДокумента,
| СУММА(втДанные.СуммаНДС) КАК СуммаНДС,
| МАКСИМУМ(втДанные.ВидДокумента) КАК ВидДокумента
|ПОМЕСТИТЬ втДанныеСгруппирован
|ИЗ
| втДанные КАК втДанные
|
|СГРУППИРОВАТЬ ПО
| втДанные.Документ,
| втДанные.СтавкаНДС
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втДанные.Документ КАК Документ,
| втДанные.Документ.Организация КАК Организация,
| втДанные.Документ.Номер КАК Номер,
| втДанные.Документ.Дата КАК Дата,
| втДанные.ВидДокумента КАК ВидДокумента,
| втДанные.СуммаДокумента КАК СуммаДокумента,
| ВЫБОР
| КОГДА втДанные.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20)
| ТОГДА 20
| КОГДА втДанные.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС20_120)
| ТОГДА 20
| КОГДА втДанные.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС18)
| ТОГДА 18
| КОГДА втДанные.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС18_118)
| ТОГДА 18
| КОГДА втДанные.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10)
| ТОГДА 10
| КОГДА втДанные.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС10_110)
| ТОГДА 10
| КОГДА втДанные.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.БезНДС)
| ТОГДА ""БезНДС""
| КОГДА втДанные.СтавкаНДС = ЗНАЧЕНИЕ(Перечисление.СтавкиНДС.НДС0)
| ТОГДА ""БезНДС""
| КОНЕЦ КАК СтавкаНДС,
| ЕСТЬNULL(втДанные.СуммаНДС, 0) КАК СуммаНДС,
// | ВЫБОР КОГДА втДанные.Документ.СуммаВключаетНДС КАК СуммаВключаетНДС
| ИСТИНА КАК СуммаВключаетНДС
|ПОМЕСТИТЬ втРезультат
|ИЗ
| втДанныеСгруппирован КАК втДанные
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втРезультат.Документ,
| МАКСИМУМ(втРезультат.СуммаДокумента) КАК СуммаДокумента,
| МАКСИМУМ(втРезультат.СтавкаНДС) КАК СтавкаНДС,
| СУММА(втРезультат.СуммаНДС) КАК СуммаНДС,
| МАКСИМУМ(втРезультат.СуммаВключаетНДС) КАК СуммаВключаетНДС,
| МАКСИМУМ(втРезультат.ВидДокумента) КАК ВидДокумента
|ПОМЕСТИТЬ втРезультатСгруппирован
|ИЗ
| втРезультат КАК втРезультат
|
|СГРУППИРОВАТЬ ПО
| втРезультат.Документ
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втРезультатСгруппирован.ВидДокумента КАК ВидДокументаИзУПП,
| втРезультатСгруппирован.Документ.Дата КАК ДатаИзУПП,
| втРезультатСгруппирован.Документ.Номер КАК НомерИзУПП,
| втРезультатСгруппирован.СуммаДокумента КАК СуммаДокументаИзУПП,
| втРезультатСгруппирован.СтавкаНДС КАК СтавкаНДСИзУПП,
| втРезультатСгруппирован.СуммаНДС КАК СуммаНДСРеглИзУПП,
| втРезультатСгруппирован.СуммаВключаетНДС КАК СуммаВключаетНДС
|ИЗ
| втРезультатСгруппирован КАК втРезультатСгруппирован
|УПОРЯДОЧИТЬ ПО
| ВидДокументаИзУПП";
НачалоПериода = Дата(2000, 1, 1);
КонецПериода = Дата(2023, 12, 31, 23, 59, 59);
Запрос.УстановитьПараметр("Дата1", НачалоПериода);
Запрос.УстановитьПараметр("Дата2", КонецПериода);
ОрганизацияКод = КодОрганизации;
Запрос.Текст = ТекстЗапроса;
Запрос.УстановитьПараметр("ОрганизацияКод", ОрганизацияКод);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
ВсегоСтрокИзУПП = Выборка.Количество();
Сообщить("Всего строк из УПП = " + ВсегоСтрокИзУПП);
Пока Выборка.Следующий() Цикл
СтруктураДокумента = Новый Структура;
СтруктураДокумента.Вставить("ВидДокументаИзУПП", Выборка.ВидДокументаИзУПП);
СтруктураДокумента.Вставить("ДатаИзУПП", НачалоДня(Выборка.ДатаИзУПП));
СтруктураДокумента.Вставить("НомерИзУПП", Выборка.НомерИзУПП);
СтруктураДокумента.Вставить("СуммаВключаетНДС", Выборка.СуммаВключаетНДС);
СтруктураДокумента.Вставить("СуммаДокументаИзУПП", Выборка.СуммаДокументаИзУПП);
СтруктураДокумента.Вставить("СтавкаНДСизУПП", Выборка.СтавкаНДСизУПП);
СтруктураДокумента.Вставить("СуммаНДСРеглИзУПП", Выборка.СуммаНДСРеглИзУПП);
МассивДокументы.Добавить(СтруктураДокумента);
КонецЦикла;
ПодключениеПоСОМНаСервере(МассивДокументы);
КонецПроцедуры
&НаКлиенте
Процедура ДозаполнениеОсновногоРегистра(Команда)
ДозаполнениеОсновногоРегистраНаСервере();
КонецПроцедуры
&НаСервере
Процедура ДозаполнениеОсновногоРегистраНаСервере()
НЗ = РегистрыСведений.КЛ_СоответствиеПервичныхДокументовСУПП.СоздатьНаборЗаписей();
Н = 0;
СпрСтавкиНДС = Справочники.СтавкиНДС;
Для каждого стр Из ТаблицаРезультат Цикл
ВидДокументаУПП = СокрЛП(стр.ВидДокументаУПП);
ВидДокументаИзУПП = ПолучитьВидДокументаУПП(ВидДокументаУПП);
Если ВидДокументаИзУПП = Неопределено Тогда
Продолжить;
КонецЕсли;
НЗ.Отбор.Организация.Установить(Организация);
НЗ.Отбор.ДокументВводаОстатков.Установить(стр.ДокументВводаОстатков);
НЗ.Отбор.ПервичныйДокумент.Установить(стр.ПервичныйДокумент);
НЗ.Прочитать();
Если НЗ.Количество() = 0 Тогда
Запись = НЗ.Добавить();
Иначе
Запись = НЗ[0];
КонецЕсли;
ЗаполнитьЗначенияСвойств(Запись, стр);
Синхронизирован = стр.ЕстьСинхронизация;
Если Синхронизирован = Ложь Тогда
Продолжить;
КонецЕсли;
Запись.ВидДокументаИзУПП = ВидДокументаИзУПП;
Запись.Синхронизирован = Синхронизирован;
ТекСтавкаНДС = СокрЛП(Строка(стр.СтавкаНДСизУПП));
Н = Н + 1;
Если ТекСтавкаНДС = "БезНДС" Тогда
СтавкаНДС = СпрСтавкиНДС.БезНДС;
Иначе
СтавкаНДС = СпрСтавкиНДС.НайтиПоНаименованию(ТекСтавкаНДС + "%", Истина);
КонецЕсли;
Если ЗначениеЗаполнено(СтавкаНДС) Тогда
Запись.СтавкаНДС = СтавкаНДС;
КонецЕсли;
Запись.СуммаНДС = стр.СуммаНДС;
Запись.СуммаБезНДС = стр.СуммаБезНДС;
Запись.Контрагент = стр.Контрагент;
Запись.Валюта = стр.Валюта;
Запись.КурсВалюты = стр.КурсВалюты;
Запись.СуммаДокументаИзУПП = стр.СуммаДокументаИзУПП;
Если СделатьЗапись Тогда
НЗ.Записать();
КонецЕсли;
//Если Н >= 1 Тогда
//
// Прервать;
//
//КонецЕсли;
КонецЦикла;
ОбщегоНазначения.СообщитьПользователю("Обработан " + Н + " записей");
КонецПроцедуры
Специалист компании ООО "Кодерлайн"
Марс Айзатуллов