1С 8.x Управляемое приложение 1С 7.7. Бухучет Статьи Ссылки
1С 8.x arrow 1С 8.x arrow Узелки на память arrow Пример работы с уникальным идентификатором (1с 8.1)
Пример работы с уникальным идентификатором (1с 8.1) Печать

 

 
 

 

 

Из бухгалтерскрой базы надо взять обороты, в казначействе создать некий документ по данным из оборотов. Сопоставление контрагентов и договоров - по уникальному идентификатору.


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);
 
КонецПроцедуры