Из бухгалтерскрой базы надо взять обороты, в казначействе создать некий документ по данным из оборотов. Сопоставление контрагентов и договоров - по уникальному идентификатору.
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);
КонецПроцедуры
Комментариев нет:
Отправить комментарий