Потребовалось в УТ быстро удалить все движения по банку, дело вроде легкое - отменить проведение всех поступлений и списаний безналичных денежных средств, но не тут то было...
При попытке отмены проведения выполнялись проверки на условия оплаты по заказу и документ ни как не отменял проведения
Ну не может типовым способом, заставим не типовым: Через запрос делаем выбору необходимых нам документов и в обработке результата пишем:
Код 1C v 8.3 Для Каждого СтрокаРезультата Из РезультатТаблица Цикл
//алгоритм обработки строки результата - начало
ДокОбъект = СтрокаРезультата.Ссылка.ПолучитьОбъект();
Для Каждого Движение ИЗ ДокОбъект.Движения Цикл
Если Движение.Количество() > 0 Тогда
Точка = Найти(Строка(Движение), ".");
ВидРегистра = Лев(Строка(Движение), Точка - 13);
РегистрИмя = СокрП(Сред(Строка(Движение), Точка + 1));
Если ВидРегистра = "РегистрНакопления" Тогда
НаборЗаписей = РегистрыНакопления[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрБухгалтерии" Тогда
НаборЗаписей = РегистрыБухгалтерии[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрСведений" Тогда
НаборЗаписей = РегистрыСведений[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрРасчета" Тогда
НаборЗаписей = РегистрыРасчета[РегистрИмя].СоздатьНаборЗаписей();
КонецЕсли;
НаборЗаписей.Отбор.Регистратор.Установить(ДокОбъект.Ссылка);
Иначе
НаборЗаписей = Движение;
КонецЕсли;
Попытка
НаборЗаписей.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
ДокОбъект.Проведен = Ложь;
//ДокОбъект.ОбменДанными.Загрузка = Истина;
ДокОбъект.Записать(режимзаписидокумента .запись);
//алгоритм обработки строки результата - конец
КонецЦикла;
Готовая функция для использования в своих обработках или общем модуле:
Код 1C v 8.3 Процедура УдалитьДвиженияДокумента(Документ)
ДокОбъект = Документ.ПолучитьОбъект();
Для Каждого Движение ИЗ ДокОбъект.Движения Цикл
Если Движение.Количество() > 0 Тогда
Точка = Найти(Строка(Движение), ".");
ВидРегистра = Лев(Строка(Движение), Точка - 13);
РегистрИмя = СокрП(Сред(Строка(Движение), Точка + 1));
Если ВидРегистра = "РегистрНакопления" Тогда
НаборЗаписей = РегистрыНакопления[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрБухгалтерии" Тогда
НаборЗаписей = РегистрыБухгалтерии[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрСведений" Тогда
НаборЗаписей = РегистрыСведений[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрРасчета" Тогда
НаборЗаписей = РегистрыРасчета[РегистрИмя].СоздатьНаборЗаписей();
КонецЕсли;
НаборЗаписей.Отбор.Регистратор.Установить(ДокОбъект.Ссылка);
Иначе
НаборЗаписей = Движение;
КонецЕсли;
Попытка
НаборЗаписей.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Потребовалось написать небольшую синхронизацию данных в дополнении к стандартной УТ-БП, нужно по уникальному идентификатору искать документы:
Стандартное Соединение.Справочники.Номенклатура.ПолучитьСсылку(УИ);
Выдает ошибку {Форма.Форма.Форма(301)}: Ошибка при вызове метода контекста (ПолучитьСсылку): Произошла исключительная ситуация: Несоответствие типов (параметр номер '1')
Нужно уникальный идентификатор создавать в com: Соединение.Справочники.Номенклатура.ПолучитьСсылку(Соединение.NewObject("УникальныйИдентификатор",Строка(УИ)));
Рабочий пример:
Код 1C v 8.3 &НаСервере
Функция ПодключитьБазуНаСервере(Соединение = "")
Объект.ФайловаяБазаДанных=Ложь;
Объект.Сервер="srv1с";
Объект.База="buh";
Объект.ИмяПользователя="Obmen";
Объект.Пароль="1qaz";
// Подключение к 1С
Если Объект.ФайловаяБазаДанных Тогда
СтрокаПодключения = "file='" + Объект.ПутьКБазе + "'; usr='" + Объект.ИмяПользователя + "'; pwd='" + Объект.Пароль + "';";
Иначе
СтрокаПодключения = "srvr='" + Объект.Сервер + "'; ref='" + Объект.База + "'; usr='" + Объект.ИмяПользователя + "'; pwd='" + Объект.Пароль + "';";
КонецЕсли;
Попытка
V8 = Новый COMObject("V83.COMConnector");
Соединение = V8.Connect(СтрокаПодключения);
ЕстьСоединение = Истина;
Исключение
ЕстьСоединение = Ложь;
Сообщить(ОписаниеОшибки());
КонецПопытки;
Возврат Соединение;
КонецФункции
&НаСервере
Процедура ОбновитьДанныеПлатежейНаСервере()
Соединение = ПодключитьБазуНаСервере();
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Ссылка КАК Ссылка,
|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.ОснованиеПлатежа КАК ОснованиеПлатежа,
|ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.Сумма КАК Сумма
|ИЗ
|Документ.ПоступлениеБезналичныхДенежныхСредств.РасшифровкаПлатежа КАК ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа
|ГДЕ
|НЕ ПоступлениеБезналичныхДенежныхСредствРасшифровкаПлатежа.ОснованиеПлатежа ССЫЛКА Документ.ЗаказКлиента";
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
УИД = ВыборкаДетальныеЗаписи.Ссылка.УникальныйИдентификатор();
СсылкаНаДок = Соединение.Документы.ПоступлениеНаРасчетныйСчет.ПолучитьСсылку(Соединение.NewObject("УникальныйИдентификатор",Строка(УИД)));
//Сообщить(СсылкаНаДок.Номер);
Для каждого СтрокаИсточник Из СсылкаНаДок.РасшифровкаПлатежа Цикл
//Сообщить("Счет: "+Строка(СтрокаИсточник.СчетНаОплату.Номер));
УИД = Соединение.String(СтрокаИсточник.СчетНаОплату.УникальныйИдентификатор());
текДок= Документы.ЗаказКлиента.ПолучитьСсылку(Новый УникальныйИдентификатор(УИД));
Если ЗначениеЗаполнено(текДок) Тогда
Сообщить(текДок);
текОбъект=ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект();
текОбъект.РасшифровкаПлатежа[0].ОснованиеПлатежа= текДок;
текОбъект.РасшифровкаПлатежа[0].Заказ= текДок;
текОбъект.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
&НаКлиенте
Процедура ОбновитьДанныеПлатежей(Команда)
ОбновитьДанныеПлатежейНаСервере();
КонецПроцедуры
В данной статье описан пример реализации загрузки данных накладных из PDF файлов для одного крупного Ритейла...
И так у Нас есть несколько файлов в формате pdf, которые нам необходимо загрузить в 1С.
Чтение PDF файлов из 1С
Первым дело я стал искать, как напрямую можно прочитать данные из 1С в PDF файлах - было найдено много информации и вариантов решений, но к сожалению большинство из них не правильно работали с кодировкой В результате банальный текст вида Красный стул превращался в страшную кракозябру.
Далее после долгих поисков был найден конвертер PDF в TXT - pdf2txt
Поддержка командной строки:
PDF2TXT <input PDF file> [output TXT file] [-logfile] [-open] [-space] [-html] [-format] [-silent] [-blankline] [-summary] [-zoom <num>] [-?] [-h]
<input PDF file> : Open an existing PDF file to convert.
[output TXT file] : Write to TEXT file, the default is same filename of input PDF file.
[-first <page number>]: Specify the first page number.
[-last <page number>]: Specify the last page number.
[-logfile] : Write log to "C:\pdf2txt.log" file.
[-open] : Auto open the text file after it be created.
[-space] : Auto insert spaces into text file.
[-html] : Output to a HTML file, not a text file.
[-format] : Keep the page layout in the generated TXT file.
[-silent] : Disable error and warning messages.
[-blankline] : Auto delete blank line in the generated TXT file.
[-summary] : Get PDF document summary.
[-zoom <num>] : Set zoom ratio, the range is from 50 to 200.
[-unicode] : Create UTF-8 encoding text file.
Примеры:
Код Batch File (DOS, CMD, BAT) C:\>PDF2TXT C:\input.pdf
C:\>PDF2TXT C:\input.pdf -unicode
C:\>PDF2TXT C:\input.pdf -first 10 -last 12
C:\>PDF2TXT C:\input.pdf C:\output.txt
C:\>PDF2TXT C:\input.pdf -open -silent -logfile -zoom 150
C:\>PDF2TXT C:\input.pdf C:\output.txt -open -silent
C:\>PDF2TXT C:\*.pdf
C:\>PDF2TXT C:\*.pdf C:\*.txt
C:\>PDF2TXT C:\test\*.pdf C:\test\*.txt
В архиве (Скачать Вы можете из статьи по ссылке ) заготовка 1С обработки для частного случая, если она Вам подойдет - Хорошо
Если же нет, то Мы можем для Вас быстро доработать загрузку PDF в 1С !
Код на 1С для конфигурации УТ 10.3:
Код 1C v 8.х Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = ",") Экспорт
МассивСтрок = Новый Массив();
Если Разделитель = " " Тогда
Стр = СокрЛП(Стр);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
МассивСтрок.Добавить(Лев(Стр,Поз-1));
Стр = СокрЛ(Сред(Стр,Поз));
КонецЦикла;
Иначе
ДлинаРазделителя = СтрДлина(Разделитель);
Пока 1=1 Цикл
Поз = Найти(Стр,Разделитель);
Если Поз=0 Тогда
МассивСтрок.Добавить(Стр);
Возврат МассивСтрок;
КонецЕсли;
ТекЗнч = СокрЛП(Лев(Стр,Поз-1));
Если ЗначениеЗаполнено(ТекЗнч) Тогда
МассивСтрок.Добавить(ТекЗнч);
КонецЕсли;
Стр = Сред(Стр,Поз+ДлинаРазделителя);
КонецЦикла;
КонецЕсли;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
//Ищем Файлы
тч.Очистить();
НайденныеФайлы = НайтиФайлы(ПутьКPDF,"*.pdf",ложь);
Для каждого стр Из НайденныеФайлы Цикл
Нстр = ТЧ.Добавить();
Нстр.ФайлPDF = стр.Имя;
КонецЦикла;
ЭтаФорма.Обновить();
//Преобразуем PDF в TXT
Для каждого стр Из ТЧ Цикл
Попытка
pdf = СокрЛП(ПутьКPDF+"\"+стр.ФайлPDF);
txt = СтрЗаменить(pdf,"pdf","txt");
Команд = ПутьКPDF2TXT+"\pdf2txt.exe "+pdf+" "+txt;
ЗапуститьПриложение(Команд,ПутьКPDF,Истина);
стр.ФайлTXT = txt;
Исключение
стр.ФайлTXT = "!!!_ОШИБКА";
КонецПопытки;
ЭлементыФормы.ТЧ.ТекущаяСтрока = стр;
ЭлементыФормы.ТЧ.ОбновитьСтроки(стр);
КонецЦикла;
мТекущийПользователь = глЗначениеПеременной("глТекущийПользователь");
мСкладПоУмолчанию = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнойСклад");
мОсновноеПодразделение = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновноеПодразделение");
мОсновнаяВалютаВзаиморасчетов = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнаяВалютаВзаиморасчетов");
мОсновноеВедениеВзаиморасчетовПоДоговорам = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновноеВедениеВзаиморасчетовПоДоговорам");
мВидНоменклатурыПоУмолчанию = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОсновнойВидНоменклатуры");
мОтражатьВРеглУчете = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВУправленческомУчете");
мОтражатьВБухУчета = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВБухгалтерскомУчете");
мОтражатьВНалУчете = УправлениеПользователями.ПолучитьЗначениеПоУмолчанию(мТекущийПользователь, "ОтражатьДокументыВНалоговомУчете");
//Создаем Документ
Для каждого стр Из ТЧ Цикл
Состояние("Загружаю: "+стр.ФайлTXT);
текдок=Новый ТекстовыйДокумент;
текдок.Прочитать(стр.ФайлTXT,"UTF-8");
ЗагрузкаТЧ=Ложь;
ДокВозвратТоваровОтПокупателя = Документы.ВозвратТоваровОтПокупателя.СоздатьДокумент();
ДокВозвратТоваровОтПокупателя.Ответственный = мТекущийПользователь;
ДокВозвратТоваровОтПокупателя.Дата = ОбщегоНазначения.ПолучитьРабочуюДату();
ДокВозвратТоваровОтПокупателя.УстановитьНовыйНомер();
ДокВозвратТоваровОтПокупателя.ВидПоступления = Перечисления.ВидыПоступленияТоваров.НаСклад;
ДокВозвратТоваровОтПокупателя.СкладОрдер = Склад;
ДокВозвратТоваровОтПокупателя.Подразделение = мОсновноеПодразделение;
ДокВозвратТоваровОтПокупателя.ВалютаДокумента = Справочники.Валюты.НайтиПоКоду("643");
ДокВозвратТоваровОтПокупателя.УчитыватьНДС = ИСТИНА;
ДокВозвратТоваровОтПокупателя.СуммаВключаетНДС = ИСТИНА;
Для Ном=1 по текдок.КоличествоСтрок() цикл
ТСтр = текдок.ПолучитьСтроку(Ном);
ТекСтр = СокрЛП(ТСтр);
Если Найти(ТекСтр, "Всего по накладной")>0 Тогда
ЗагрузкаТЧ=Ложь;
//делаем пересчеты сумм, количества мест и НДС по строкам
Для Каждого СтрокаТабличнойЧасти Из ДокВозвратТоваровОтПокупателя.Товары Цикл
ОбработкаТабличныхЧастей.РассчитатьКоличествоМестТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
ОбработкаТабличныхЧастей.РассчитатьСуммуТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
ОбработкаТабличныхЧастей.РассчитатьСуммуНДСТабЧасти(СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя);
КонецЦикла;
Попытка
ДокВозвратТоваровОтПокупателя.Записать(РежимЗаписиДокумента.Проведение);
Исключение
ДокВозвратТоваровОтПокупателя.Записать(РежимЗаписиДокумента.Запись);
КонецПопытки;
стр.Документ = ДокВозвратТоваровОтПокупателя.Ссылка;
стр.Инфо = "Все ОК";
ЭлементыФормы.ТЧ.ТекущаяСтрока = стр;
ЭлементыФормы.ТЧ.ОбновитьСтроки(стр);
//ВСЕ
Прервать;
КонецЕсли;
Если ЗагрузкаТЧ Тогда
ТекСтр = СтрЗаменить(ТекСтр, "подложке ","подложке");
ТекСтр = СтрЗаменить(ТекСтр, " ","|");
СтрМ=РазложитьСтрокуВМассивПодстрок(ТекСтр,"|");
Если СтрМ.Количество()>2 Тогда
//Сообщить(СтрМ);
Попытка
НоваяСтрока = ДокВозвратТоваровОтПокупателя.Товары.Добавить();
НоваяСтрока.Номенклатура = Справочники.Номенклатура.НайтиПоКоду(СтрМ[2]);
//НоваяСтрока.ХарактеристикаНоменклатуры = СтрокаТаблицы.ХарактеристикаНоменклатуры;
//УстановитьСтавкуНДСВТабЧасти(НоваяСтрока, СтрокаТаблицы);
//ПроверитьНаличиеСерииНоменклатуры(НоваяСтрока, СтрокаТаблицы);
//УстановитьПризнакВеденияПоСериямНоменклатуры(НоваяСтрока);
НоваяСтрока.ЕдиницаИзмерения = НоваяСтрока.Номенклатура.БазоваяЕдиницаИзмерения;
НоваяСтрока.Коэффициент = 1;
НоваяСтрока.Количество = Число(СтрМ[6]);
НоваяСтрока.Цена = Число(СтрМ[7]);
НоваяСтрока.Сумма = Число(СтрМ[8]);
НоваяСтрока.СуммаНДС = Число(СтрМ[11]);
НоваяСтрока.Качество = Справочники.Качество.Новый;
Попытка
НоваяСтрока.СтавкаНДС = Перечисления.СтавкиНДС["НДС"+Лев(СокрЛП(СтрМ[9]),2)];
Исключение
НоваяСтрока.СтавкаНДС = НоваяСтрока.Номенклатура.СтавкаНДС;
КонецПопытки;
Исключение
Сообщить("Не загружено: "+ТекСтр);
КонецПопытки;
Иначе
Продолжить;
КонецЕсли;
Иначе
// Возможно что-то будет
КонецЕсли;
//Сообщить(ТекСтр);
Если Найти(ТекСтр, "Товарная накладная")>0 Тогда
ТекСтр = СтрЗаменить(ТекСтр, " ","|");
СтрМ=РазложитьСтрокуВМассивПодстрок(ТекСтр,"|");
Если СтрМ.Количество()>1 Тогда
//Сообщить(СтрМ);
ДокВозвратТоваровОтПокупателя.НомерВходящегоДокументаЭлектронногоОбмена = СтрМ[1];
ТекДата = СтрМ[2];
ДокВозвратТоваровОтПокупателя.ДатаВходящегоДокументаЭлектронногоОбмена = Дата(Прав(ТекДата,4)+Сред(ТекДата,4,2)+Лев(ТекДата,2));
КонецЕсли;
КонецЕсли;
Если Найти(ТекСтр, "Грузополучатель:")>0 Тогда
//Сообщить(ТекСтр);
//Получим ИНН
ГдеИНН = Найти(ТекСтр, "ИНН");
Если ГдеИНН>0 Тогда
ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));
ТекОрганизация = Справочники.Организации.НайтиПоРеквизиту("ИНН",текИНН);
Если ТекОрганизация=Справочники.Организации.ПустаяСсылка() Тогда
ДокВозвратТоваровОтПокупателя.Организация = Организация;
Иначе
ДокВозвратТоваровОтПокупателя.Организация = ТекОрганизация;
КонецЕсли;
КонецЕсли;
КонецЕсли;
Если Найти(ТекСтр, "Поставщик:")>0 Тогда
//Сообщить(ТекСтр);
//Получим ИНН
ГдеИНН = Найти(ТекСтр, "ИНН");
Если ГдеИНН>0 Тогда
ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));
ТекПоставщик = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН",текИНН);
ДокВозвратТоваровОтПокупателя.Контрагент = ТекПоставщик;
ДокВозвратТоваровОтПокупателя.ДоговорКонтрагента = ТекПоставщик.ОсновнойДоговорКонтрагента;
КонецЕсли;
КонецЕсли;
Если Найти(ТекСтр, "Плательщик:")>0 Тогда
//Сообщить(ТекСтр);
//Получим ИНН
ГдеИНН = Найти(ТекСтр, "ИНН");
Если ГдеИНН>0 Тогда
ГдеИННвр= лев(ТекСтр,ГдеИНН+15);
текИНН = Прав(гдеИННвр, СтрДлина(ГдеИННвр)-(ГдеИНН+3));
текИНН = СокрЛП(СтрЗаменить(текИНН,".","")); текИНН = СокрЛП(СтрЗаменить(текИНН,",",""));
ТекПлательщик = Справочники.Контрагенты.НайтиПоРеквизиту("ИНН",текИНН);
КонецЕсли;
КонецЕсли;
Если текстр="1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" Тогда
ЗагрузкаТЧ=Истина;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецПроцедуры
Процедура ПутьКPDF2TXTОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.Каталог = "";
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберите каталог с PDF2TXT";
Если ДиалогОткрытия.Выбрать() Тогда
ПутьКPDF2TXT = ДиалогОткрытия.Каталог;
ПутьКPDF = ДиалогОткрытия.Каталог;
КонецЕсли;
КонецПроцедуры
Процедура ПутьКPDFОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Режим = РежимДиалогаВыбораФайла.ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла(Режим);
ДиалогОткрытия.Каталог = "";
ДиалогОткрытия.МножественныйВыбор = Ложь;
ДиалогОткрытия.Заголовок = "Выберите каталог с PDF2TXT";
Если ДиалогОткрытия.Выбрать() Тогда
ПутьКPDF = ДиалогОткрытия.Каталог;
КонецЕсли;
КонецПроцедуры
Код 1C v 8.х //Пример кода
Перем Подключились;
Перем COMОбъект;
Функция ПолучитьНом(Выборка)
Ном = Справочники.Номенклатура.НайтиПоНаименованию(СокрЛП(Выборка.Номенклатура));
Если Ном.Пустая() Тогда
ВвестиЗначение(Ном, "Выберите номенклатуру " + СокрЛП(Выборка.Номенклатура), Тип("СправочникСсылка.Номенклатура"));
КонецЕсли;
Возврат Ном;
КонецФункции
Функция ПодключитьсяКCRM()
Подключились = Истина;
Попытка
Подкл = Новый COMОбъект("V82.COMConnector");
COMОбъект = Подкл.Connect("Srvr=""Server1"";Ref=""TradeUT"";Usr=""ObmenBot"";Pwd=""12345""");
Исключение
Сообщить(ОписаниеОшибки());
Подключились = Ложь;
КонецПопытки;
Возврат Подключились;
КонецФункции
Процедура Реализации_Анализ(Элемент)
Если не Подключились Тогда
Если не ПодключитьсяКCRM() Тогда
Возврат;
КонецЕсли;
КонецЕсли;
Запрос = COMОбъект.NewObject("Запрос");
Запрос.Текст = ПолучитьМакет("ЗапросПродажи").ПолучитьТекст();
Запрос.УстановитьПараметр("Дата1", НачалоДня(ДатаНач));
Запрос.УстановитьПараметр("Дата2", КонецДня(ДатаКон));
глРезультатЗапросаПродажи = Запрос.Выполнить();
Выборка = глРезультатЗапросаПродажи.Выбрать(COMОбъект.ОбходРезультатаЗапроса.ПоГруппировкам);
ДокРеал = Документы.РеализацияТоваровУслуг;
СпрКонтр = Справочники.Контрагенты;
ТаблицаДокументов.Очистить();
Пока Выборка.Следующий() Цикл
ОбработкаПрерыванияПользователя();
Стр = ТаблицаДокументов.Добавить();
ЗаполнитьЗначенияСвойств(Стр, Выборка);
Стр.Документ = ДокРеал.НайтиПоНомеру(Стр.Номер, Стр.Дата);
Стр.ТекстКонтрагент = Выборка.КонтрагентНаименование + ", ИНН " + Выборка.ИННКонтрагента;
Если не ПустаяСтрока(Выборка.ИННКонтрагента) Тогда
ВыборкаКонтр = СпрКонтр.Выбрать(,, Новый Структура("ИНН", Выборка.ИННКонтрагента));
Пока ВыборкаКонтр.Следующий() Цикл
Если не ЗначениеЗаполнено(Стр.Контрагент) или ВыборкаКонтр.КПП = Выборка.КППКонтрагента Тогда
Стр.Контрагент = ВыборкаКонтр.Ссылка;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ЭлементыФормы.кнЗагрузитьШаг1.Доступность = Истина;
ЭлементыФормы.ИндикаторРеал.МаксимальноеЗначение = ТаблицаДокументов.Количество();
КонецПроцедуры
Процедура Реализации_Загрузить(Элемент)
ЭлементыФормы.ИндикаторРеал.МаксимальноеЗначение = ТаблицаДокументов.Количество();
ЗначениеИндикатораРеал = 0;
ДокРеал = Документы.РеализацияТоваровУслуг;
ВыборкаДок = глРезультатЗапросаПродажи.Выбрать(COMОбъект.ОбходРезультатаЗапроса.ПоГруппировкам);
мСписокВидовДоговоров = Новый СписокЗначений;
мСписокВидовДоговоров.Добавить(Перечисления.ВидыДоговоровКонтрагентов.СПокупателем);
СпособЗаполненияЦен = Перечисления.СпособыЗаполненияЦен.ПоЦенамНоменклатуры;
Пока ВыборкаДок.Следующий() Цикл
ЗначениеИндикатораРеал = ЗначениеИндикатораРеал + 1;
СтрокаТаб = ТаблицаДокументов.Найти(ВыборкаДок.Номер, "Номер");
Если СтрокаТаб <> Неопределено Тогда
Если ЗначениеЗаполнено(СтрокаТаб.Документ) Тогда
Док = СтрокаТаб.Документ.ПолучитьОбъект();
Док.Товары.Очистить();
Док.Услуги.Очистить();
Иначе
Док = ДокРеал.СоздатьДокумент();
КонецЕсли;
Док.Дата = ВыборкаДок.Дата;
Док.Номер = ВыборкаДок.Номер;
Док.Контрагент = СтрокаТаб.Контрагент;
ЗаполнениеДокументов.ЗаполнитьШапкуДокумента(Док, глЗначениеПеременной("глТекущийПользователь"), Док.мВалютаРегламентированногоУчета, "Продажа");
ЗаполнениеДокументов.ПриИзмененииЗначенияКонтрагента(Док, мСписокВидовДоговоров);
ЗаполнениеДокументов.ПриИзмененииЗначенияДоговора(Док, Док.ВалютаДокумента, Док.мВалютаРегламентированногоУчета, СпособЗаполненияЦен, Ценообразование.ПолучитьСтруктуруРеквизитовДокументаДляЦенообразования(Док), "Продажа", "Товары", Неопределено);
Док.ЗаполнитьСчетаУчетаРасчетов();
Док.УчитыватьНДС = Ложь;
ВыборкаНом = ВыборкаДок.Выбрать(COMОбъект.ОбходРезультатаЗапроса.ПоГруппировкам);
Пока ВыборкаНом.Следующий() Цикл
ОбработкаПрерыванияПользователя();
Ном = ПолучитьНом(ВыборкаНом);
Если ВыборкаНом.Идентификатор = 1 Тогда
СтрокаТЧ = Док.Товары.Добавить();
СтрокаТЧ.Номенклатура = Ном;
Док.ЗаполнитьСчетаУчетаВСтрокеТабЧасти(СтрокаТЧ, "Товары", Истина);
Иначе
СтрокаТЧ = Док.Услуги.Добавить();
СтрокаТЧ.Номенклатура = Ном;
Док.ЗаполнитьСчетаУчетаВСтрокеТабЧастиУслуги(СтрокаТЧ, ИСТИНА);
ОбработкаТабличныхЧастей.ЗаполнитьСодержаниеТабЧасти(СтрокаТЧ, Док);
КонецЕсли;
ОбработкаТабличныхЧастей.ЗаполнитьСтавкуНДСТабЧасти(СтрокаТЧ, Док);
ОбработкаТабличныхЧастей.ЗаполнитьЕдиницуЦенуПродажиТабЧасти(СтрокаТЧ, Док, Док.мВалютаРегламентированногоУчета);
СтрокаТЧ.Количество = ВыборкаНом.Количество;
СтрокаТЧ.Сумма = ВыборкаНом.Сумма;
СтрокаТЧ.Цена = СтрокаТЧ.Сумма / ?(ВыборкаНом.Количество = 0, 1, ВыборкаНом.Количество);
КонецЦикла;
Если не ВыборкаДок.ДоставкаОтдельно и ВыборкаДок.СтоимостьДоставкиПлан <> 0 Тогда
СтрокаТЧ = Док.Товары.Добавить();
СтрокаТЧ.Номенклатура = Док.Товары[0].Номенклатура;
Док.ЗаполнитьСчетаУчетаВСтрокеТабЧасти(СтрокаТЧ, "Товары", Истина);
ОбработкаТабличныхЧастей.ЗаполнитьСтавкуНДСТабЧасти(СтрокаТЧ, Док);
ОбработкаТабличныхЧастей.ЗаполнитьЕдиницуЦенуПродажиТабЧасти(СтрокаТЧ, Док, Док.мВалютаРегламентированногоУчета);
СтрокаТЧ.Сумма = - ВыборкаДок.СтоимостьДоставкиПлан;
СтрокаТЧ = Док.Услуги.Добавить();
СтрокаТЧ.Номенклатура = Справочники.Номенклатура.ТранспортныеУслуги;
Док.ЗаполнитьСчетаУчетаВСтрокеТабЧастиУслуги(СтрокаТЧ, ИСТИНА);
ОбработкаТабличныхЧастей.ЗаполнитьСодержаниеТабЧасти(СтрокаТЧ, Док);
ОбработкаТабличныхЧастей.ЗаполнитьСтавкуНДСТабЧасти(СтрокаТЧ, Док);
ОбработкаТабличныхЧастей.ЗаполнитьЕдиницуЦенуПродажиТабЧасти(СтрокаТЧ, Док, Док.мВалютаРегламентированногоУчета);
СтрокаТЧ.Количество = 1;
СтрокаТЧ.Цена = ВыборкаДок.СтоимостьДоставкиПлан;
СтрокаТЧ.Сумма = ВыборкаДок.СтоимостьДоставкиПлан;
КонецЕсли;
Ош = Ложь;
Попытка
Док.Записать(?(Проводить, РежимЗаписиДокумента.Проведение, РежимЗаписиДокумента.Запись));
Ош = Истина;
Исключение
КонецПопытки;
Если Ош и Проводить Тогда
Док.Записать(РежимЗаписиДокумента.Запись);
КонецЕсли;
СтрокаТаб.Документ = Док.Ссылка;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Подключились = Ложь;
Код 1C v 7.x xmldoc = CreateObject("Msxml2.DOMDocument");
xmlDoc.loadXML("<root/>");
nodeRoot = xmlDoc.documentElement;
расходы = xmlDoc.createElement("СправочникРасходы");
Спр = Создатьобъект("Справочник.Расходы");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 цикл
расход = xmlDoc.createElement("Расход");
расход.setAttribute("Код",Спр.Код);
расход.setAttribute("Наименование",Спр.Наименование);
расход.setAttribute("Родитель",Строка(Спр.Родитель));
расход.setAttribute("Цена",Строка(Спр.Цена.Получить(ТекущаяДата())));
расход.setAttribute("Количество",Строка(Спр.Количество));
расход.setAttribute("ЭтоГруппа",Строка(Спр.ЭтоГруппа()));
расходы.appendChild(расход);
КонецЦикла;
nodeRoot.appendChild(расходы);
ДвижениеСчетов = xmlDoc.createElement("ДвижениеСчетов");
рег = СоздатьОбъект("Регистр.Счет");
рег.ВыбратьДвижения();
Пока Рег.ПолучитьДвижение()=1 цикл
Движение = xmlDoc.createElement("Движение");
Движение.setAttribute("Приход",Строка(Рег.Приход));
Движение.setAttribute("Дата",Строка(Рег.ТекущийДокумент().ДатаДок));
Движение.setAttribute("Описатель",Строка(Рег.Описатель));
Движение.setAttribute("СтатьяРасходов",Строка(Рег.СтатьяРасходов));
Движение.setAttribute("СтатьяПоступлений",Строка(Рег.СтатьяПоступлений));
Движение.setAttribute("Кто",Строка(Рег.Кто));
Движение.setAttribute("Кому",Строка(Рег.Кому));
Движение.setAttribute("Остаток",Строка(Рег.Остаток));
Движение.setAttribute("Количество",Строка(Рег.Количество));
ДвижениеСчетов.appendChild(Движение);
КонецЦикла;
nodeRoot.appendChild(ДвижениеСчетов);
xmlDoc.save("C:\budjet.xml");
Код 1C v 8.х
Функция Кошель(Кош)
стр = ТП2.Найти(Кош,"Описатель");
Возврат Стр.Счет;
КонецФункции
Функция Вал(Кош)
стр = ТП2.Найти(Кош,"Описатель");
Возврат Стр.Валюта;
КонецФункции
Функция Дата1С(дат)
Возврат "20"+сред(дат,7,2)+сред(дат,4,2)+лев(дат,2);
КонецФункции
Процедура Загрузка(Элемент)
xmlDoc = Новый COMОбъект("MSXML2.DOMDocument");
xmlDoc.load("C:\budjet.xml");
nodeRoot = xmlDoc.documentElement;
Для каждого nod из nodeRoot.childNodes цикл
Если nod.nodeName = "СправочникРасходы" тогда
Сообщить("нашли СправочникРасходы");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Код");
ТЗ.Колонки.Добавить("Наименование");
ТЗ.Колонки.Добавить("Родитель");
ТЗ.Колонки.Добавить("Цена");
ТЗ.Колонки.Добавить("Количество");
ТЗ.Колонки.Добавить("ЭтоГруппа");
Для Каждого Расход из nod.childNodes Цикл
Строка = ТЗ.Добавить();
Строка.Код = Расход.getAttribute("Код");
Строка.Наименование = Расход.getAttribute("Наименование");
Строка.Родитель = Расход.getAttribute("Родитель");
Строка.Цена = Число(Расход.getAttribute("Цена"));
Строка.Количество = Число(Расход.getAttribute("Количество"));
Строка.ЭтоГруппа = ?(Расход.getAttribute("ЭтоГруппа")="1",True,Ложь);
КонецЦикла;
//ТЗ.ВыбратьСтроку();
Для Каждого Стр из ТЗ Цикл
Родитель = Справочники.СтатьиЗатрат.НайтиПоНаименованию(Стр.Родитель,истина);
Справ = Справочники.СтатьиЗатрат.НайтиПоНаименованию(Стр.Наименование,истина);
Если Справ = Справочники.СтатьиЗатрат.ПустаяСсылка() тогда
Если Стр.ЭтоГруппа тогда
Справ = Справочники.СтатьиЗатрат.СоздатьГруппу();
Справ.Код = Стр.Код;
Справ.Наименование = Стр.Наименование;
Справ.Родитель = Родитель;
Справ.Записать();
Иначе
Справ = Справочники.СтатьиЗатрат.СоздатьЭлемент();
Справ.Код = Стр.Код;
Справ.Наименование = Стр.Наименование;
Справ.Родитель = Родитель;
Справ.Цена = Стр.Цена;
Справ.Количество = Стр.Количество;
Справ.Записать();
КонецЕсли;
Иначе
КонецЕсли;
КонецЦикла;
ИначеЕсли nod.nodeName = "ДвижениеСчетов" тогда
Сообщить("нашли движения счетов");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Приход");
ТЗ.Колонки.Добавить("Дата");
ТЗ.Колонки.Добавить("Описатель");
ТЗ.Колонки.Добавить("Статья");
ТЗ.Колонки.Добавить("Цена");
ТЗ.Колонки.Добавить("Количество");
Для каждого движ из nod.childNodes цикл
Строка = ТЗ.Добавить();
Строка.Приход = ?(движ.getAttribute("Приход")="1",True,Ложь);
Строка.Дата = Дата(Дата1С(движ.getAttribute("Дата")));
Строка.Описатель = движ.getAttribute("Описатель");
Строка.Статья = Справочники.СтатьиЗатрат.НайтиПоНаименованию(движ.getAttribute(?(Строка.Приход,"СтатьяПоступлений","СтатьяРасходов")),истина);
Строка.Цена = Число(движ.getAttribute("Остаток"));
Строка.Количество = Число(движ.getAttribute("Количество"));
КонецЦикла;
ТЗ.ВыбратьСтроку();
Доки = Новый ТаблицаЗначений;
Доки.Колонки.Добавить("Док");
Доки.Колонки.Добавить("Дата");
Доки.Колонки.Добавить("КошелекС");
Доки.Колонки.Добавить("КошелекНа");
Доки.Колонки.Добавить("Статья");
Доки.Колонки.Добавить("ВалютаС");
Доки.Колонки.Добавить("ВалютаНа");
Доки.Колонки.Добавить("ЦенаС");
Доки.Колонки.Добавить("ЦенаНа");
Доки.Колонки.Добавить("Количество");
УжеЕстьДок=Ложь;
док=0;
Для Каждого Стр Из ТЗ цикл
Если Стр.Приход Тогда
Если УжеЕстьДок тогда
Док.КошелекНа = Кошель(Стр.Описатель);
Док.ВалютаНа = Вал(Стр.Описатель);
Док.ЦенаНа = Стр.Цена;
Док.Количество = Стр.Количество;
Док.Статья = Стр.Статья;
УжеЕстьДок=Ложь;
Иначе
Док = Доки.Добавить();
Док.КошелекНа = Кошель(Стр.Описатель);
Док.ВалютаНа = Вал(Стр.Описатель);
Док.ЦенаНа = Стр.Цена;
Док.Количество = Стр.Количество;
Док.Статья = Стр.Статья;
Док.Док = "ПоступлениеСредств";
КонецЕсли;
Иначе
Док = Доки.Добавить();
Док.КошелекС = Кошель(Стр.Описатель);
Док.ВалютаС = Вал(Стр.Описатель);
Док.ЦенаС = Стр.Цена;
Док.Количество = Стр.Количество;
Док.Статья = Стр.Статья;
Если СокрЛП(Стр.Статья.Наименование)="Обмен валюты" тогда
Док.Док = "ОбменВалюты";
УжеЕстьДок=истина;
ИначеЕсли СокрЛП(Стр.Статья.Наименование)="Перевод средств" тогда
Док.Док = "ПереводСредств";
УжеЕстьДок=истина;
Иначе
Док.Док = "РасходСредств";
УжеЕстьДок=Ложь;
КонецЕсли;
КонецЕсли;
Док.Дата = Стр.Дата;
КонецЦикла;
Доки.ВыбратьСтроку();
КонецЕсли;
КонецЦикла;
Для Каждого Док из Доки Цикл
Если Док.Док = "ПоступлениеСредств" тогда
Докум = Документы.ПоступлениеСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.Кошелек = Док.КошелекНа;
Докум.Валюта = Док.ВалютаНа;
Докум.Сумма = Док.ЦенаНа;
Докум.Статья = Док.Статья;
Докум.Записать(РежимЗаписиДокумента.Проведение);
ИначеЕсли Док.Док = "ПереводСредств" тогда
Докум = Документы.ПеремещениеСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.КошелекКуда = Док.КошелекНа;
Докум.КошелекОтКуда = Док.КошелекС;
Докум.Валюта = Док.ВалютаНа;
Докум.Сумма = Док.ЦенаНа;
Докум.Записать(РежимЗаписиДокумента.Проведение);
ИначеЕсли Док.Док = "ОбменВалюты" тогда
Докум = Документы.ПеремещениеСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.КошелекКуда = Док.КошелекНа;
Докум.КошелекОтКуда = Док.КошелекС;
Докум.Валюта = Док.ВалютаС;
Докум.Сумма = Док.ЦенаС;
Докум.Записать(РежимЗаписиДокумента.Проведение);
Докум = Документы.ОбменВалюты.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.Кошелек = Док.КошелекНа;
Докум.ВалютаС = Док.ВалютаС;
Докум.ВалютаНа = Док.ВалютаНа;
Докум.СуммаС = Док.ЦенаС;
Докум.СуммаНа = Док.ЦенаНа;
Докум.Курс = Докум.СуммаС / Докум.СуммаНа;
Докум.Переключатель = 1;
Докум.Записать(РежимЗаписиДокумента.Проведение);
Иначе
Докум = Документы.РасходСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.Кошелек = Док.КошелекС;
Докум.Валюта = Док.ВалютаС;
тч = Докум.Затраты.Добавить();
тч.Сумма = Док.ЦенаС;
тч.Статья = Док.Статья;
тч.Цена = Док.ЦенаС;
тч.Количество = Док.Количество;
Докум.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьТЗДанными(Элемент)
xmlDoc = Новый COMОбъект("MSXML2.DOMDocument");
xmlDoc.load("C:\budjet.xml");
nodeRoot = xmlDoc.documentElement;
Для каждого nod из nodeRoot.childNodes цикл
Если nod.nodeName = "ДвижениеСчетов" тогда
Сообщить("нашли движения счетов");
ТП1 = Новый ТаблицаЗначений;
ТП1.Колонки.Добавить("Описатель");
Типы = Новый Массив(1); Типы[0] = Тип("СправочникСсылка.Кошельки");
Тип = Новый ОписаниеТипов(Типы);
ТП1.Колонки.Добавить("Счет",Тип);
Типы[0] = Тип("СправочникСсылка.Валюты");
Тип = Новый ОписаниеТипов(Типы);
ТП1.Колонки.Добавить("Валюта",Тип);
Для каждого движ из nod.childNodes цикл
Описатель = движ.getAttribute("Описатель");
если ТП1.Найти(Описатель,"Описатель") = Неопределено тогда
стр = ТП1.Добавить();
Стр.Описатель = Описатель;
КонецЕсли;
КонецЦикла;
ТП2=ТП1;//ВыбратьСтроку();
КонецЕсли;
КонецЦикла;
КонецПроцедуры