Из бухгалтерскрой базы надо взять обороты, в казначействе создать некий документ по данным из оборотов. Сопоставление контрагентов и договоров - по уникальному идентификатору.
1) В бухгалтерии в модуле внешнего соединения создаем процедуру
#Если ВнешнееСоединение Тогда
//Возвращает строковое представление уникального идентификатора Функция СРШ_ВернутьСтроковоеПредставлениеУникальногоИдентификатора(мУникальныйИдентификатор) Экспорт Возврат(Строка(мУникальныйИдентификатор)); КонецФункции
#КонецЕсли
2) Обработка, модуль формы
перем Бух;перем СоответствиеКодов; //Код - КодБух (справочник СтатьиДвиженияДС), Значение КодКазн (справочник СРШ_СтатьиБюджета) перем ЛогСозданныхДокументов;
//Подключаем 1С-бухгалтерию по OLE в серверном варианте Функция ПодключитьИБ() //НовыйПодключенныйОбъект = Новый COMОбъект("V8.Application"); НовыйПодключенныйОбъект = Новый COMОбъект("V81.COMConnector"); Бух = НовыйПодключенныйОбъект.Connect("Srvr=" + СокрЛП(Сервер) + ";Ref=" + СокрЛП(ИмяИБ) + ";Usr=" + """"+ СокрЛП(Пользователь) + """"+";Pwd=" + """"+СокрЛП(Пароль) + """"+";"); Если Бух = 0 Тогда Сообщить("Ошибка открытия ИБ !", "!"); Возврат Ложь; Иначе Сообщить("Подключена ИБ", СтатусСообщения.Информация); КонецЕсли; Возврат Истина; КонецФункции
Процедура ПутьКФайлуСоответствияНачалоВыбора(Элемент, СтандартнаяОбработка) ДиалогФыбораФайла = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Открытие); ДиалогФыбораФайла.Фильтр = "Файл Excel(*.xls)|*.xls"; ДиалогФыбораФайла.Заголовок = "Выбор файла импорта"; ДиалогФыбораФайла.ПроверятьСуществованиеФайла = Истина; Если ДиалогФыбораФайла.Выбрать() Тогда Элемент.Значение = ДиалогФыбораФайла.ПолноеИмяФайла; КонецЕсли; КонецПроцедуры
Процедура ПриОткрытии() Если НЕ ЗначениеЗаполнено(ДатаКон) Тогда ДатаКон = КонецДня(РабочаяДата); КонецЕсли; Если НЕ ЗначениеЗаполнено(ДатаНач) Тогда ДатаНач = НачалоДня(НачалоМесяца(ДобавитьМесяц(ДатаКон,-9))); КонецЕсли; Если НЕ ЗначениеЗаполнено(ДатаДок) Тогда ДатаДок = КонецДня(РабочаяДата); КонецЕсли; Если НЕ ЗначениеЗаполнено(Филиал) Тогда Филиал = Справочники.Организации.НайтиПоКоду("000000006"); КонецЕсли; КонецПроцедуры
Функция ПроверитьЗаполненеОбязательныхРеквизитов() Для каждого ЭлементФормы Из ЭтаФорма.ЭлементыФормы Цикл Если ТипЗнч(ЭлементФормы) = Тип("ПолеВвода") Тогда Если ЭлементФормы.АвтоОтметкаНезаполненного Тогда Если Не ЗначениеЗаполнено(ЭлементФормы.Значение) Тогда Возврат Ложь; КонецЕсли; КонецЕсли; КонецЕсли; КонецЦикла; Возврат Истина; КонецФункции
Процедура КоманднаяПанель1Сформировать(Кнопка) Если Не ПроверитьЗаполненеОбязательныхРеквизитов()Тогда Сообщить("Для выполнения обработки необходимо заполнить все обязательные поля.", СтатусСообщения.Важное); Возврат; КонецЕсли; Если Не ПодключитьИБ() Тогда Сообщить("Обработка не может быть выполнена, так как ИБ не подключена!", СтатусСообщения.Важное); Возврат; КонецЕсли; ЗагрузитьXLSФайл(); Сформировать_СРШ_КарточкаБюджетногоСоответствия();//Формируем документ ВывестиЛогСозданныхДокументов(); КонецПроцедуры
Процедура ЗагрузитьXLSФайл() СоответствиеКодов = Новый Соответствие; Попытка Excel = Новый COMОбъект("Excel.Application"); Excel.Visible = Ложь; Excel.DisplayAlerts = Ложь; WorkBooks = Excel.WorkBooks.Open(ПутьКФайлуСоответствия, 0, True); Worksheet = WorkBooks.Worksheets(2); Исключение Сообщить("Ошибка открытия файла: "+ОписаниеОшибки(), СтатусСообщения.Важное); Возврат ; КонецПопытки; ОК = Истина; // Последняя строка данных Cells = Worksheet.Cells.SpecialCells(11); мНомерПоследнейСтроки = Cells.Row; мТекСтр=8; Пока мТекСтр<= мНомерПоследнейСтроки Цикл Состояние("Обрабатывается строка xls-файла №" + Строка(мТекСтр)); Попытка мКодБух = СокрЛП(Worksheet.Cells(мТекСтр,2).Text); мКодКазн = СокрЛП(Worksheet.Cells(мТекСтр,10).Text); Исключение Сообщить("Ошибка при чтении строки "+ Строка(мТекСтр)+" файла " + ПутьКФайлуСоответствия, СтатусСообщения.ОченьВажное); мТекСтр=мТекСтр+1; Продолжить; КонецПопытки; СоответствиеКодов.Вставить(мКодБух,мКодКазн); мТекСтр=мТекСтр+1; КонецЦикла; WorkBooks.Close(); Возврат; КонецПроцедуры
//Формирование документов СРШ_КарточкаБюджетногоСоответствия Процедура Сформировать_СРШ_КарточкаБюджетногоСоответствия() ЛогСозданныхДокументов = Новый СписокЗначений; СписокСчетовДт = Бух.NewObject("СписокЗначений"); СписокСчетовКт = Бух.NewObject("СписокЗначений"); СписокОрганизаций = Бух.NewObject("СписокЗначений"); МассивСубконтоДт = Бух.NewObject("Массив"); МассивСубконтоКт = Бух.NewObject("Массив"); ПланСчетовХозрасчетный = Бух.ПланыСчетов.Хозрасчетный; ВидыСубконтоХозрасчетные = Бух.ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные; СправочникОрганизации = Бух.Справочники.Организации; СписокСчетовДт.Добавить(ПланСчетовХозрасчетный.НайтиПоКоду("60")); СписокСчетовКт.Добавить(ПланСчетовХозрасчетный.НайтиПоКоду("50")); СписокСчетовКт.Добавить(ПланСчетовХозрасчетный.НайтиПоКоду("51")); СписокСчетовКт.Добавить(ПланСчетовХозрасчетный.НайтиПоКоду("52")); СписокОрганизаций.Добавить(СправочникОрганизации.НайтиПоКоду("ЦО ")); СписокОрганизаций.Добавить(СправочникОрганизации.НайтиПоКоду("МФ ")); МассивСубконтоДт.Добавить(ВидыСубконтоХозрасчетные.Контрагенты); МассивСубконтоДт.Добавить(ВидыСубконтоХозрасчетные.Договоры); МассивСубконтоКт.Добавить(ВидыСубконтоХозрасчетные.СтатьиДвиженияДенежныхСредств); Запрос = Бух.NewObject("Запрос"); Запрос.УстановитьПараметр("ДатаНач", НачалоДня(ДатаНач)); Запрос.УстановитьПараметр("ДатаКон", Новый Граница(КонецДня(ДатаКон), ВидГраницы.Включая)); Запрос.УстановитьПараметр("ДатаКон", КонецДня(ДатаКон)); Запрос.УстановитьПараметр("СписокСчетовДт",СписокСчетовДт); Запрос.УстановитьПараметр("СписокСчетовКт",СписокСчетовКт); Запрос.УстановитьПараметр("МассивСубконтоДт",МассивСубконтоДт); Запрос.УстановитьПараметр("МассивСубконтоКт",МассивСубконтоКт); Запрос.УстановитьПараметр("СписокОрганизаций",СписокОрганизаций); ТекстЗапроса = "ВЫБРАТЬ | ХозрасчетныйОборотыДтКт.СубконтоДт1 КАК Контрагент, | ХозрасчетныйОборотыДтКт.СубконтоДт2 КАК Договор, | ХозрасчетныйОборотыДтКт.СубконтоКт1 КАК СтатьяДвиженияДС, | ХозрасчетныйОборотыДтКт.СуммаОборот, | ХозрасчетныйОборотыДтКт.ВалютаДт.Код КАК КодВалюты |ИЗ | РегистрБухгалтерии.Хозрасчетный.ОборотыДтКт(&ДатаНач, &ДатаКон, , СчетДт В ИЕРАРХИИ (&СписокСчетовДт), &МассивСубконтоДт, СчетКт В ИЕРАРХИИ (&СписокСчетовКт), &МассивСубконтоКт, Организация В (&СписокОрганизаций)) КАК ХозрасчетныйОборотыДтКт"; Запрос.Текст = ТекстЗапроса; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл КодВалБух = Выборка.КодВалюты; Если КодВалБух = NULL Тогда КодВалБух = "643"; КонецЕсли; ВалютаСсылка = Справочники.Валюты.НайтиПоКоду(КодВалБух); Если НЕ ЗначениеЗаполнено(ВалютаСсылка) Тогда Сообщить("В Казначействе не найден элемент справочника Валюты с кодом " + Выборка.КодВалюты); Продолжить; КонецЕсли; СтрокаGUIDКонтрагенты = Бух.СРШ_ВернутьСтроковоеПредставлениеУникальногоИдентификатора(Выборка.Контрагент.УникальныйИдентификатор()); НовыйGUIDКонтрагент = Новый УникальныйИдентификатор(СтрокаGUIDКонтрагенты); КонтрагентСсылка = Справочники.СРШ_Контрагенты.ПолучитьСсылку(НовыйGUIDКонтрагент); Если (КонтрагентСсылка = Справочники.СРШ_Контрагенты.ПустаяСсылка()) Или (КонтрагентСсылка.Наименование ="") Тогда Сообщить("Для контрагента из бухгалтерии 8.1: " + Выборка.Контрагент.Наименование + " не найдено соответствие в справочнике СРШ_Контрагенты в Казначействе", СтатусСообщения.Важное); Продолжить; Иначе //Сообщить ("Опознали контрагента" + Строка(Выборка.Контрагент.Наименование), СтатусСообщения.Информация); КонецЕсли; СтрокаGUIDДоговоры = Бух.СРШ_ВернутьСтроковоеПредставлениеУникальногоИдентификатора(Выборка.Договор.УникальныйИдентификатор()); НовыйGUIDДоговор = Новый УникальныйИдентификатор(СтрокаGUIDДоговоры); ДоговорСсылка = Справочники.СРШ_Договоры.ПолучитьСсылку(НовыйGUIDДоговор); Если ((ДоговорСсылка = Справочники.СРШ_Договоры.ПустаяСсылка()) Или (ДоговорСсылка.Наименование ="") )Тогда Сообщить("Для договора из бухгалтерии 8.1: " + Выборка.Договор.Наименование + " не найдено соответствие в справочнике СРШ_Договоры в Казначействе", СтатусСообщения.Важное); Продолжить; Иначе //Сообщить("Опознан договор " + Выборка.Договор.Наименование); КонецЕсли; //Проверяем статью движения ДС КодСБКазн = СоответствиеКодов[СокрЛП(Выборка.СтатьяДвиженияДС.Код)]; Если КодСБКазн= Неопределено Тогда Сообщить("Для статьи бюджета с кодом "+ СокрЛП(Выборка.СтатьяДвиженияДС.Код) + " из бухгалтерии не найден соответствующий код в файле " + ПутьКФайлуСоответствия, СтатусСообщения.Важное); Продолжить; КонецЕсли; СтатьяБюджетаСсылка = Справочники.СРШ_СтатьиБюджета.НайтиПоКоду(КодСБКазн); Если Не ЗначениеЗаполнено(СтатьяБюджетаСсылка) Тогда Сообщить("Для статьи бюджета с кодом "+ Выборка.СтатьяДвиженияДС.Код + " из бухгалтерии не найден элемент справочника СРШ_СтатьиБюджета с кодом " + КодСБКазн, СтатусСообщения.Важное); Продолжить; Иначе //Сообщить("Опознана статья бюджета " + Строка(СтатьяБюджетаСсылка)); КонецЕсли; //Создаем документ СоздатьДокумент_СРШ_КарточкаБюджетногоСоответствия(ВалютаСсылка, КонтрагентСсылка, ДоговорСсылка,СтатьяБюджетаСсылка); КонецЦикла; КонецПроцедуры
//Непосредственно создает документ Процедура СоздатьДокумент_СРШ_КарточкаБюджетногоСоответствия(ВалютаСсылка, КонтрагентСсылка, ДоговорСсылка,СтатьяБюджетаСсылка) Док = Документы.СРШ_КарточкаБюджетногоСоответствия.СоздатьДокумент(); Док.Дата = ДатаДок; Док.Филиал = Филиал; Док.СтатьяБюджета = СтатьяБюджетаСсылка; Док.Контрагент = КонтрагентСсылка; Док.Договор = ДоговорСсылка; Док.ВалютаДокумента = ВалютаСсылка; Док.Статус = Перечисления.СРШ_СтатусыДокумента.Оформляется; Док.БюджетныйГод = Справочники.Периоды.НайтиПоНаименованию(Строка(Формат(Год(ДатаДок),"ЧГ=0")), Ложь);//ищем по левой части Попытка Док.Записать(); Исключение КонецПопытки; ЛогСозданныхДокументов.Добавить("Создан документ:" + Строка(Док) + " Контрагент:" + Строка(КонтрагентСсылка) + " Договор: " + Строка(ДоговорСсылка) + " Статья бюджета:" + Строка(СтатьяБюджетаСсылка)); КонецПроцедуры
Процедура ВывестиЛогСозданныхДокументов() Для каждого СтрокаЛога Из ЛогСозданныхДокументов Цикл Сообщить(Строка(СтрокаЛога), СтатусСообщения.Информация); КонецЦикла; КонецПроцедуры
Процедура ПутьКФайлуСоответствияОткрытие(Элемент, СтандартнаяОбработка) СтандартнаяОбработка = Ложь; ЗапуститьПриложение(Элемент.Значение); КонецПроцедуры
Процедура Кнопка1Нажатие(Элемент) ЗагрузитьXLSФайл() КонецПроцедуры
Процедура КнопкаНастройкаПериодаНажатие(Элемент) СтарДатаНач = ДатаНач; СтарДатаКон = ДатаКон; НП = Новый НастройкаПериода; НП.ВариантНастройки = ВариантНастройкиПериода.Период; НП.ВариантНачала = ВариантГраницыИнтервала.Год; НП.ВариантОкончания = ВариантГраницыИнтервала.Год; НП.РедактироватьКакИнтервал = Ложь; НП.ДатаНачала = ДатаНач; НП.ДатаОкончания = ДатаКон; Если НП.Редактировать()Тогда ДатаНач = НП.ПолучитьДатуНачала(); ДатаКон = НП.ПолучитьДатуОкончания(); КонецЕсли; мГод = Год(ДатаНач); мНачалоГода = Дата(мГод,1,1); мКонецГода = Дата(мГод,12,31); КонецПроцедуры |