Функция проверки необходимости перерасчета и Перерасчет записей Код 1C v 8.х
Функция НеобходимостьПерерасчета(Регистратор) Экспорт
Запрос = Новый Запрос( "ВЫБРАТЬ ПЕРВЫЕ 1
| Перерасчет.ФизЛицо
|ИЗ
| (ВЫБРАТЬ ПЕРВЫЕ 1
| Перерасчет.ФизЛицо КАК ФизЛицо
| ИЗ
| РегистрРасчета.ОсновныеНачисленияРегл.ПерерасчетОсновныхНачислений
| КАК Перерасчет
| ГДЕ
| Перерасчет.ОбъектПерерасчета = &Регистратор
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ ПЕРВЫЕ 1
| Перерасчет.ФизЛицо
| ИЗ
|РегистрРасчета.ДополнительныеНачисленияРегл.ПерерасчетДополнительныхНачислений
| КАК Перерасчет
| ГДЕ
| Перерасчет.ОбъектПерерасчета = &Регистратор) КАК Перерасчет" ) ;
Запрос. УстановитьПараметр( "Регистратор" , Регистратор) ; Если Запрос. Выполнить( ) . Пустой( ) Тогда
Возврат Ложь ;
Иначе
Возврат Истина ;
КонецЕсли ;
КонецФункции
Данная функция возвращает значение Истина, если хотя бы в одной из таблиц перерасчета есть хотя бы одна запись по данному документу. Если таких записей нет, то функция вернет значение Ложь, и перерассчитывать записи этого документа не нужно.
Собственно перерасчет записей, как и их расчет, рекомендуется выполнять в процедуре общего модуля по тем же причинам, что и расчет. Процедура перерасчета отличается от процедуры расчета только тем, что в расчете участвуют не все записи документа, а только удовлетворяющие усло- виям проводимого перерасчета. Например, только записи по конкретным сотрудникам и конкретным видам расчета.
Наконец, после того как нужные записи перерассчитаны, необхо- димо средствами встроенного языка удалить соответствующие записи из таблицы перерасчета, так как перерасчет больше не требуется.
Процедуру перерасчета записей документа рекомендуется помещать в модуле этого документа как экспортную процедуру. В этом случае она может быть вызвана из других модулей, в том числе из обработки перерасчета, описанной в предыдущем разделе. В качестве параметров в процедуру должна передаваться информация о том, какие именно записи документа необходимо перерассчитать. Ниже приведен пример такой процедуры, где в качестве параметра используется список сотрудников, по которым необходимо выполнить перерасчет.
Процедура перерасчета записей документа
Код 1C v 8.х Процедура Перерассчитать(Физлица = Неопределено) Экспорт
Если Не Расчеты. НеобходимостьПерерасчета( Ссылка) Тогда
Возврат ; КонецЕсли ;
Расчеты. ПерерассчитатьЗаписиРегистраРасчета( "ОсновныеНачисленияРегл" , Движения. ОсновныеНачисленияРегл, ОсновныеНачисления, Физлица) ;
Движения. ОсновныеНачисленияРегл. Записать( Истина , Истина ) ;
Расчеты. ПерерассчитатьЗаписиРегистраРасчета( "ДополнительныеНачисленияРегл" , Движения. ДополнительныеНачисленияРегл, ДополнительныеНачисления, Физлица) ;
Движения. ДополнительныеНачисленияРегл. Записать( Истина , Истина ) ;
Если Н = 1 Тогда
НаборЗаписей = РегистрыРасчета. ОсновныеНачисленияРегл.
Перерасчеты. ПерерасчетОсновныхНачислений. СоздатьНаборЗаписей( ) ;
НаборЗаписей. Записать( ) ; КонецЦикла ;
КонецПроцедуры
Процедуры общего модуля, выполняющие непосредственный перерасчет записей, по алгоритму схожи с процедурами расчета. Основное отличие состоит в том, что в процедурах перерасчета происходит расчет только тех записей, которые удовлетворяют заданным условиям. В данном случае это записи по заданному списку сотрудников. Также при перерасчете не нужно производить предварительную запись набора с формированием фактического периода действия, так как набор уже записан в регистр (перерассчитываемый документ всегда проведен). Ниже приведен пример процедур
ПерерассчитатьЗаписиРегистраРасчета() и ПерерассчитатьНаборЗаписей() . Эти процедуры используют вызов тех же самых процедур и функций, которые используются при расчете.
Процедуры перерасчета записей
Код 1C v 8.х Процедура ПерерассчитатьНаборЗаписей(НаборЗаписей, Приоритет, ТабличнаяЧасть = Неопределено, ФизЛица = Неопределено)
Для каждого Запись из НаборЗаписей Цикл
Если Запись. ВидРасчета. Приоритет = Приоритет Тогда
Если НЕ ФизЛица. НайтиПоЗначению( Запись. Физлицо) = Неопределено Тогда
ДанныеДляРасчета = ПолучитьДанныеДляРасчета( Запись) ;
Иначе
НаборЗаписей = РегистрыРасчета. ДополнительныеНачисленияРегл.
Перерасчеты. ПерерасчетДополнительныхНачислений. СоздатьНаборЗаписей( ) ;
КонецЕсли ;
НаборЗаписей. Отбор. ОбъектПерерасчета. Значение = Ссылка; Если Физлица < > НеОпределено Тогда
НаборЗаписей. Прочитать( ) ; СтрокиКУдалению = Новый Массив;
Для Каждого СтрокаПерерасчета из НаборЗаписей Цикл
Если Физлица. НайтиПоЗначению( СтрокаПерерасчета. Физлицо) < > НеОпределено Тогда СтрокиКУдалению. Добавить( СтрокаПерерасчета) ;
КонецЕсли ; КонецЦикла ;
Для Каждого Строка Из СтрокиКУдалению Цикл
НаборЗаписей. Удалить( Строка) ; КонецЦикла ;
КонецЕсли ;
СтрокаТабличнойЧасти = ТабличнаяЧасть. Получить( Запись. НомерСтроки- 1 ) ;
СтрокаТабличнойЧасти. Результат = Запись. Результат; КонецЕсли ;
КонецЕсли ; КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Процедура ПерерассчитатьЗаписиРегистраРасчета(ИмяРегистра,
НаборЗаписей, ТабличнаяЧасть = Неопределено, Физлица = Неопределено) Экспорт
Регистратор = НаборЗаписей. Отбор. Регистратор. Значение;
Запрос = Новый Запрос; Запрос. Текст = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| " + ИмяРегистра + ".ВидРасчета.Приоритет КАК Приоритет
|ИЗ
| РегистрРасчета." + ИмяРегистра + " КАК " + ИмяРегистра + "
|ГДЕ
| ФизЛицо В (&СписокФизлиц) И Регистратор = &Регистратор
|УПОРЯДОЧИТЬ ПО
| Приоритет
|ИТОГИ ПО
| " + ИмяРегистра + ".ВидРасчета.Приоритет" ;
Запрос. УстановитьПараметр( "СписокФизлиц" , Физлица) ; Запрос. УстановитьПараметр( "Регистратор" , Регистратор) ;
ВыборкаПриоритетов = Запрос. Выполнить( ) .
Выбрать( ОбходРезультатаЗапроса. ПоГруппировкам) ;
ПерерассчитатьНаборЗаписей( НаборЗаписей, ВыборкаПриоритетов. Приоритет, ТабличнаяЧасть, Физлица) ;
КонецЦикла ;
КонецПроцедуры
Категория:
Регистры расчета Формирование записей перерасчета Код 1C v 8.х
Процедура СформироватьЗаписиПерерасчета()
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| СдельнаяВыработка.ФизЛицо,
| СдельнаяВыработка.Организация,
| ОсновныеНачисленияРегл.Регистратор,
| ОсновныеНачисленияРегл.ВидРасчета
|ИЗ
| РегистрНакопления.СдельнаяВыработка КАК СдельнаяВыработка
| ЛЕВОЕ СОЕДИНЕНИЕ
| РегистрРасчета.ОсновныеНачисленияРегл КАК ОсновныеНачисленияРегл
| ПО СдельнаяВыработка.ФизЛицо = ОсновныеНачисленияРегл.ФизЛицо
| И СдельнаяВыработка.Организация = ОсновныеНачисленияРегл.Организация
| И (СдельнаяВыработка.Период МЕЖДУ
| ОсновныеНачисленияРегл.ПериодДействияНачало
| И ОсновныеНачисленияРегл.ПериодДействияКонец)
|ГДЕ
| ОсновныеНачисленияРегл.ВидРасчета = &ВидРасчета
| И СдельнаяВыработка.Регистратор = &Регистратор
|ИТОГИ ПО
| Регистратор");
Запрос. УстановитьПараметр( "ВидРасчета" , ПланыВидовРасчета. ОсновныеНачисления. Сдельный) ;
Запрос. УстановитьПараметр( "Регистратор" , Ссылка) ;
ВыборкаДокументов = Запрос. Выполнить( ) .
Выбрать( ОбходРезультатаЗапроса. ПоГруппировкам) ;
Перерасчет = РегистрыРасчета. ОсновныеНачисленияРегл.
Перерасчеты. ПерерасчетОсновныхНачислений;
Пока ВыборкаДокументов. Следующий( ) Цикл
НаборЗаписей = Перерасчет. СоздатьНаборЗаписей( ) ; НаборЗаписей. Отбор. ОбъектПерерасчета. Значение = ВыборкаДокументов. Регистратор;
Выборка = ВыборкаДокументов. Выбрать( ) ;
Запись = НаборЗаписей. Добавить( ) ; Запись. ВидРасчета = Выборка. ВидРасчета; Запись. Организация = Выборка. Организация; Запись. ФизЛицо = Выборка. ФизЛицо;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Категория:
Регистры расчета Классификация записей по приоритету видов расчета Расчет записей одного документа необходимо производить в последовательности, определяемой приоритетом видов расчета, участвующих в этих записях. Поэтому исходный набор записей должен быть разбит на несколько поднаборов, в каждом из которых будут записи одного приоритета. Затем необходимо последовательно рассчитать записи каждого из поднаборов, записав результат расчета в регистр. Запись каждого рассчитанного поднабора необходима для формирования базы расчета следующих по приоритету поднаборов.
Ниже приведен пример процедуры, которая классифицирует записи исходного набора по приоритету видов расчета и для каждого уровня приоритета вызывает процедуру расчета поднабора записей. В данном случае из набора записей выгружается массив видов расчета, после чего по этим видам расчета строится запрос с иерархией по приоритету.
Расчет записей по приоритету видов расчета
Код 1C v 8.х Процедура РассчитатьЗаписиРегистраРасчета(ИмяРегистра, НаборЗаписей, ТабличнаяЧасть = Неопределено) Экспорт
НаборЗаписей. Записать( Истина , Ложь ) ;
Метаданные. РегистрыРасчета[ИмяРегистра]. ПланВидовРасчета. Имя;
МассивВидовРасчета = ТаблицаВидовРасчета. ВыгрузитьКолонку( "ВидРасчета" ) ;
Запрос. Текст = "
|ВЫБРАТЬ РАЗЛИЧНЫЕ
| Приоритет
|ИЗ
| ПланВидовРасчета." + ИмяПланаВидовРасчета + " КАК " +
| ИмяПланаВидовРасчета + "
|ГДЕ
| Ссылка В (&МассивВидовРасчета)
|УПОРЯДОЧИТЬ ПО
| " + ИмяПланаВидовРасчета + ".Приоритет
|ИТОГИ ПО
| Приоритет";
Запрос. УстановитьПараметр( "МассивВидовРасчета" , МассивВидовРасчета) ; ВыборкаПриоритетов = Запрос. Выполнить( ) .
Выбрать( ОбходРезультатаЗапроса. ПоГруппировкам) ;
РассчитатьНаборЗаписей( НаборЗаписей, ВыборкаПриоритетов. Приоритет, ТабличнаяЧасть) ;
КонецЦикла ;
КонецПроцедуры
После расчета записей каждого приоритета необходимо перезаписать весь набор в регистр для образования базы расчета для записей следующего приоритета. При этом параметр ТолькоЗапись метода Записать() должен быть установлен в значение Истина, так как пересчитывать фактический период действия уже не нужно, он был рассчитан при первоначальной записи.
ПРИМЕЧАНИЕ
После расчета записей последнего приоритета набор записей можно не перезаписывать, но только в том случае, если в документе после этого не будет производиться расчет записей другого регистра, который может использовать данные текущего регистра как базу. Например, если после расчета регистра основных начислений в модуле будет сразу производиться расчет дополнительных начислений, то записи регистра основных начислений после расчета последнего приоритета должны быть перезаписаны. Категория:
Регистры расчета Подключение к ИБ через Com, Получение списка документов и их Загрузка Код 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 ;
СтрокаТЧ. Цена = ВыборкаДок. СтоимостьДоставкиПлан;
СтрокаТЧ. Сумма = ВыборкаДок. СтоимостьДоставкиПлан;
КонецЕсли ;
Ош = Ложь ;
Попытка
Док. Записать( ? ( Проводить, РежимЗаписиДокумента. Проведение, РежимЗаписиДокумента. Запись) ) ;
Ош = Истина ;
Исключение
КонецПопытки ;
Если Ош и Проводить Тогда
Док. Записать( РежимЗаписиДокумента. Запись) ;
КонецЕсли ;
СтрокаТаб. Документ = Док. Ссылка;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Подключились = Ложь ;
Категория:
COM-объекты, WMI, WSH Создание и работа с БД MySQL из 1С Появилась необходимость выложить часть данных из 1С в открытый доступ большому числу пользователей.
Что бы не нарушать условий лицензирования и обеспечить безопасность данных, было принято решение развернуть новую базу на MySQL. Так как особо модерировать ее никто не хочет, пришлось сделать управление MySQL-ной БД из 1С, и начал с создания структуры БД. Итак:
Создаем 2 справочника неирархических, один подчинен другому.
а.
Таблицы
б.
Колонки
Таблицы - реквизиты:
Автокод - Булево (Определяет необходимость нумеровать запись уникальным кодом, или отдать нумерование на откуп MySQL)
Таблицы - колонки:
ТипДанных - Число (в коде определим тип хранящихся данных по числу)
Длина - Число (длина хранящихся данных)
МожетБытьНоль - булево (может ли хранится пустое значение)
Связь - СсылкаНа таблицу (С которой есть связь все к одному)
Заполняем значениями справочники...
Теперь подключаемся:
Код 1C v 8.х Connection = Новый COMОбъект( "ADODB.Connection" ) ;
СтрокаПодключения = "DRIVER={MySQL ODBC 5.1 Driver};OPTION=3;DATABASE=" + константы. lk_БД. Получить( ) + ";PWD=" + константы. lk_Пароль. Получить( ) + ";PORT=3306;SERVER=" + константы. lk_Сервер. Получить( ) + ";UID=" + константы. lk_Пользователь. Получить( ) + ";" ;
Connection. Open( СокрЛП( СтрокаПодключения) ) ;
Сначала удалим таблицы если они есть:
Код 1C v 8.х Результат = Новый COMОбъект( "ADODB.Command" ) ;
Результат. ActiveConnection = Connection;
Результат. CommandTimeOut = Connection. CommandTimeOut;
Результат. CommandType = "adCmdText" ;
Запрос = Новый Запрос;
Запрос. Текст = "ВЫБРАТЬ
| Таблицы.Наименование КАК Таблица
| ИЗ
| Справочник.Таблицы КАК Таблицы" ;
ВыборкаТаблиц = Запрос. Выполнить( ) . Выбрать( ) ;
Пока ВыборкаТаблиц. Следующий( ) Цикл
Результат. CommandText = " D_rop TABLE IF EXISTS " + ВыборкаТаблиц. Таблица + " ;" ;
Результат. Execute( ) ;
КонецЦикла ;
Теперь приступим к созданию таблиц БД:
Код 1C v 8.х Запрос = Новый Запрос;
Запрос. Текст = "ВЫБРАТЬ
| Таблицы.Наименование КАК Таблица,
| Колонки.Наименование КАК Колонка,
| Колонки.ТипДанных,
| Колонки.Длина,
| Колонки.МожетБытьНоль,
| Колонки.Связь.Наименование КАК Связь
|ИЗ
| Справочник.Колонки КАК Колонки
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ Справочник.Таблицы КАК Таблицы
| ПО Колонки.Владелец = Таблицы.Ссылка
|
|ИТОГИ ПО
| Таблица" ;
ВыборкаТаблиц = Запрос. Выполнить( ) . Выбрать( ОбходРезультатаЗапроса. ПоГруппировкам) ;
Пока ВыборкаТаблиц. Следующий( ) Цикл
Скрипт = " CREATE TABLE " + ВыборкаТаблиц. Таблица + " ( " + символ( 13 ) +
" " + ПолучитьКолонкуID( ВыборкаТаблиц. Таблица) + " int(11) NOT NULL " + ? ( Справочники. Lk_Таблицы. НайтиПоНаименованию( ВыборкаТаблиц. Таблица) . АвтоКод, "auto_increment" , "" ) + "," + символ( 13 ) ;
Выборка = ВыборкаТаблиц. Выбрать( ) ;
Строчека = "" ;
Ключики = "" ;
Пока Выборка. Следующий( ) цикл
Строчека = Строчека + "`" + Выборка. Колонка + "` " + ПолучитьПродолжениеСкрипта( Выборка. ТипДанных, Выборка. длина, Выборка. МожетБытьНоль) + "," + символ( 13 ) ;
ЕСли ЗначениеЗаполнено( Выборка. Связь) Тогда
Ключики = Ключики + ", KEY `FK_" + ВыборкаТаблиц. Таблица + "-" + Выборка. Колонка + "` (`" + Выборка. Колонка + "`),
| CONSTRAINT `FK_" + ВыборкаТаблиц. Таблица + "-" + Выборка. Колонка + "` FOREIGN KEY (`" + Выборка. Колонка + "`) REFERENCES `" + Выборка. Связь + "` (`" + ПолучитьКолонкуID( Выборка. Связь) + "`)" + Символ( 13 ) ;
КонецЕсли ;
КонецЦикла ;
Скрипт = Скрипт + Строчека;
Скрипт = Скрипт + " PRIMARY KEY (" + ПолучитьКолонкуID( ВыборкаТаблиц. Таблица) + ") " + символ( 13 ) + Ключики +
" ) ENGINE=InnoDB DEFAULT CHARSET=utf8;" ;
Сообщить( "Таблица создана: " + ВыборкаТаблиц. Таблица) ;
Результат. CommandText = скрипт;
Результат. Execute( ) ;
КонецЦикла ;
Connection. Close( ) ;
И под закуску недостающие функции, использованные в основном тексте:
Код 1C v 8.х Функция ПолучитьКолонкуID(зн) экспорт
ПрефиксКончился = Ложь ;
Колонка = "" ;
Для сч = 1 по СтрДлина( зн) Цикл
Символик = Mid( зн, Сч, 1 ) ;
Если ПрефиксКончился Тогда
Колонка = Колонка + Символик;
КонецЕсли ;
Если Символик = "_" Тогда
ПрефиксКончился = Истина ;
КонецЕсли ;
КонецЦикла ;
Если Колонка = "" Тогда
Колонка = зн;
КонецЕсли ;
Колонка = Колонка + "ID" ;
Возврат Колонка;
КонецФункции
Предполагается что название таблиц идут с префиксом например: prefix_NameTable
Код 1C v 8.х Функция ПолучитьПродолжениеСкрипта(ТипД,ДлинаД,Ноль) экспорт
Если ТипД = 1 тогда
Зн = " varchar(" + Строка( ДлинаД) + ") " + ? ( Ноль, "null" , "NOT NULL" ) ;
ИначеЕсли ТипД = 2 Тогда
Зн = " int(11) " + ? ( Ноль, "null" , "NOT NULL" ) ;
ИначеЕсли ТипД = 3 Тогда
Зн = " smallint(6) " + ? ( Ноль, "null" , "NOT NULL" ) ;
ИначеЕсли типД = 4 тогда
Зн = " text" ;
ИначеЕсли ТипД = 5 тогда
Зн = " date " + ? ( Ноль, "null" , "NOT NULL" ) ;
ИначеЕсли ТипД = 6 Тогда
Зн = " bit(1) " + ? ( Ноль, "null" , "NOT NULL" ) ;
ИначеЕсли ТипД = 7 Тогда
Зн = " dateTime " + ? ( Ноль, "null" , "NOT NULL" ) ;
КонецЕсли ;
Возврат Зн;
КонецФункции
Источник Категория:
COM-объекты, WMI, WSH Создание XML файла выгрузки Работников организации с Группировкой по Подразделению Нужен XML файл выгрузки данных вида(выделю как код 8-рки, т.к. выделение xlm кода нет):
Код 1C v 8.х < ? xml version= "1.0" encoding= "UTF-8" ? >
< orgstructure>
< department dep_id= "7ebb913c-e9c6-11dc-a4f2-0017311416a1" dep_name= "генеральный директор" dep_code= "П100" >
< orgposition user_id= "ba68bb79-c377-11dc-a4ca-0017311416a1" user_position_id= "ba68bb78-c377-11dc-a4ca-0017311416a1" user_position= "генеральный директор" user_is_active= "1" / >
< / department>
< department dep_id= "8132fe4a-0789-11dd-887b-001d60f0496c" dep_name= "Бухгалтерия" dep_code= "П200" >
< orgposition user_id= "21448456-15b0-11dd-80a1-00145e3710ab" user_position_id= "3c948267-df80-11dc-a4e8-0017311416a1" user_position= "специалист" user_is_active= "0" / >
< orgposition user_id= "d299614a-df9d-11dc-a4e8-0017311416a1" user_position_id= "53082fda-edf4-11dd-af3e-00145e3710ab" user_position= "заместитель главного бухгалтера" user_is_active= "1" / >
< orgposition user_id= "8132fe6c-0789-11dd-887b-001d60f0496c" user_position_id= "d299614d-df9d-11dc-a4e8-0017311416a1" user_position= "секретарь" user_is_active= "1" / >
< orgposition user_id= "2e81c20e-f190-11dc-a4fb-0017311416a1" user_position_id= "2e81c20d-f190-11dc-a4fb-0017311416a1" user_position= "бухгалтер" user_is_active= "0" / >
< orgposition user_id= "ba68bb7e-c377-11dc-a4ca-0017311416a1" user_position_id= "53082fd9-edf4-11dd-af3e-00145e3710ab" user_position= "главный бухгалтер" user_is_active= "1" / >
< orgposition user_id= "9893f85a-0403-11df-a872-00215aa545b4" user_position_id= "53073825-e5e6-11dc-a4ef-0017311416a1" user_position= "делопроизводитель" user_is_active= "1" / >
< / department>
< department dep_id= "6bb91f72-e077-11dd-bf56-00145e3710ab" dep_name= "Отдел Продаж" dep_code= "П300" >
< department dep_id= "6bb91f73-e077-11dd-bf56-00145e3710ab" dep_name= "Клиентский сервис" dep_code= "П310" >
< orgposition user_id= "02ad5122-e231-11dd-bf56-00145e3710ab" user_position_id= "6bb91f6c-e077-11dd-bf56-00145e3710ab" user_position= "Специалист" user_is_active= "1" / >
< / department>
< department dep_id= "6bb91f74-e077-11dd-bf56-00145e3710ab" dep_name= "Менеджеры" dep_code= "П320" >
< orgposition user_id= "02584921-с235-11dd-bf56-00145e3710ab" user_position_id= "7bb98f6c-e577-11dd-bf56-00145e3710ab" user_position= "Менеджер" user_is_active= "1" / >
< / department>
< / department>
< / orgstructure>
Вот код:
Код 1C v 8.х Процедура ОбойтиУровеньДерева(Строки, Запись)
Для каждого Строка из Строки Цикл
Если ПустаяСтрока( Строка( Строка. Сотрудник) ) Тогда
Запись. ЗаписатьНачалоЭлемента( "department" ) ;
Запись. ЗаписатьАтрибут( "dep_id" , Строка( Строка. ПодразделениеОрганизации. УникальныйИдентификатор( ) ) ) ;
Запись. ЗаписатьАтрибут( "dep_name" , Строка( Строка. ПодразделениеОрганизации) ) ;
Запись. ЗаписатьАтрибут( "dep_code" , СокрЛП( Строка( Строка. ПодразделениеОрганизации. Код) ) ) ;
ОбойтиУровеньДерева( Строка. Строки, Запись) ;
Запись. ЗаписатьКонецЭлемента( ) ;
Иначе
Запись. ЗаписатьНачалоЭлемента( "orgposition" ) ;
Запись. ЗаписатьАтрибут( "user_id" , Строка( Строка. Сотрудник. УникальныйИдентификатор( ) ) ) ;
Запись. ЗаписатьАтрибут( "user_position_id" , Строка( Строка. Должность. УникальныйИдентификатор( ) ) ) ;
Запись. ЗаписатьАтрибут( "user_position" , Строка( Строка. Должность) ) ;
Запись. ЗаписатьАтрибут( "user_is_active" , ? ( Строка. ПричинаИзмененияСостояния = Перечисления. ПричиныИзмененияСостояния. Увольнение, "0" , "1" ) ) ;
ОбойтиУровеньДерева( Строка. Строки, Запись) ;
Запись. ЗаписатьКонецЭлемента( ) ;
КонецЕсли
КонецЦикла ;
КонецПроцедуры
Процедура КнопкаВыгрузитьНажатие(Кнопка)
ПутьКФайлу = "D:\Vigruzka_" + Формат( ТекущаяДата( ) , "ДФ=YYYYMMdd" ) + ".xml" ;
Запись = Новый ЗаписьXML;
Запись. ОткрытьФайл( ПутьКФайлу, "UTF-8" ) ;
Запись. ЗаписатьОбъявлениеXML( ) ;
Запись. ЗаписатьНачалоЭлемента( "orgstructure" ) ;
Запрос = Новый Запрос;
Запрос. Текст= "
|ВЫБРАТЬ
| РаботникиОрганизацийСрезПоследних.Сотрудник,
| РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации КАК ПодразделениеОрганизации,
| РаботникиОрганизацийСрезПоследних.Должность,
| РаботникиОрганизацийСрезПоследних.Период,
| РаботникиОрганизацийСрезПоследних.ПодразделениеОрганизации.Порядок КАК ПодразделениеОрганизацииПорядок,
| РаботникиОрганизацийСрезПоследних.ПричинаИзмененияСостояния
|ИЗ
| РегистрСведений.РаботникиОрганизаций.СрезПоследних(&dateper, ) КАК РаботникиОрганизацийСрезПоследних
|
|УПОРЯДОЧИТЬ ПО
| ПодразделениеОрганизацииПорядок
|ИТОГИ ПО
| ПодразделениеОрганизации ИЕРАРХИЯ
|АВТОУПОРЯДОЧИВАНИЕ
|" ;
Запрос. УстановитьПараметр( "dateper" , ТекущаяДата( ) ) ;
Результат = Запрос. Выполнить( ) ;
Дерево = Результат. Выгрузить( ОбходРезультатаЗапроса. ПоГруппировкамСИерархией) ;
ОбойтиУровеньДерева( Дерево. Строки, Запись) ;
Запись. ЗаписатьКонецЭлемента( ) ;
Запись. Закрыть( ) ;
КонецПроцедуры
Категория:
JSON, XML, TXT, CSV, DBF Как обойти, перебрать дерево значений? Код 1C v 8.х Процедура ОбойтиУровеньДерева(Строки)
Для каждого Строка из Строки Цикл
Сообщить( Строка. ИмяСуществующегоВСтрокеРеквизита) ;
ОбойтиУровеньДерева( Строка. Строки) ;
КонецЦикла ;
КонецПроцедуры
Дерево = Новый ДеревоЗначений;
Запрос = Новый Запрос;
Запрос. Текст= "ВЫБРАТЬ
|Ном.Ссылка как ссылка
|ИЗ
| Справочник.Номенклатура КАК Ном
|ИТОГИ ПО
|Ном.Ссылка ТОЛЬКО ИЕРАРХИЯ" ;
Дерево = Запрос. Выполнить( ) . Выгрузить( ОбходРезультатаЗапроса. ПоГруппировкамСИерархией) ;
ОбойтиУровеньДерева( Дерево. Строки) ;
Категория:
Работа с Деревом Значений Выгрузить результат запроса в Дерево Значений, Дерево Значений на форме Код 1C v 8.х
Запрос= Новый Запрос;
Запрос. Текст= "ВЫБРАТЬ
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.ПериодВзаиморасчетов КАК ЗаМесяц,
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.Физлицо КАК Работник,
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.СуммаВзаиморасчетовОстаток КАК Остаток
|ИЗ
| РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций.Остатки(, ) КАК ВзаиморасчетыСРаботникамиОрганизацийОстатки
|ГДЕ
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.СуммаВзаиморасчетовОстаток < 5
| И ВзаиморасчетыСРаботникамиОрганизацийОстатки.ПериодВзаиморасчетов > ДАТАВРЕМЯ(2011, 1, 1, 0, 0, 0)
|
|УПОРЯДОЧИТЬ ПО
| ЗаМесяц,
| Работник
|ИТОГИ
| СУММА(Остаток)
|ПО
| ЗаМесяц
|АВТОУПОРЯДОЧИВАНИЕ" ;
ЭлементыФормы. Долги. Значение = Запрос. Выполнить( ) . Выгрузить( ОбходРезультатаЗапроса. ПоГруппировкамСИерархией) ;
ЭлементыФормы. Долги. СоздатьКолонки( ) ;
ЭлементыФормы. Долги. Колонки. Работник. Ширина= 23 ;
ЭлементыФормы. Долги. Колонки. ЗаМесяц. Ширина= 17 ;
ЭлементыФормы. Долги. Колонки. Остаток. Ширина= 11 ;
еще пример:
Код 1C v 8.х Запрос = Новый Запрос;
Запрос. Текст =
"ВЫБРАТЬ
| Номенклатура.Наименование КАК Наименование
|ИЗ
| Справочник.Номенклатура КАК Номенклатура
|
|УПОРЯДОЧИТЬ ПО
| Наименование ИЕРАРХИЯ" ;
Результат = Запрос. Выполнить( ) ;
Дерево = Результат. Выгрузить( ОбходРезультатаЗапроса. ПоГруппировкамСИерархией) ;
ЭлементыФормы. Дерево. СоздатьКолонки( ) ;
Категория:
Запросы Выборка из результата запроса всех вошедших в него значений группировок При обходе результата запроса нередко возникает необходимость получения всех значений группировок внутри какой-либо другой группировки. Такая возможность может понадобиться, например, при выводе кросс отчета. Для обеспечения такой возможности в объекте
ВыборкаИзРезультатаЗапроса предусмотрен третий параметр функции
Выбрать() .
Рассмотрим пример. Пусть нам необходимо получить кросс-отчет по остаткам номенклатуры на различных складах. Номенклатуру необходимо вывести в строках, склады - в колонках.
Запрос для получения остатков будет выглядеть так:
Код 1C v 8.х ВЫБРАТЬ
УчетНоменклатурыОстатки. Номенклатура КАК Номенклатура,
УчетНоменклатурыОстатки. Номенклатура. Представление,
УчетНоменклатурыОстатки. Склад КАК Склад,
УчетНоменклатурыОстатки. Склад. Представление,
УчетНоменклатурыОстатки. КоличествоОстаток КАК КоличествоОстаток
ИЗ
РегистрНакопления. УчетНоменклатуры. Остатки КАК УчетНоменклатурыОстатки
ИТОГИ СУММА( КоличествоОстаток) ПО
ОБЩИЕ,
Номенклатура,
Склад
Для обхода номенклатуры воспользуемся выборкой из результата запроса:
Код 1C v 8.х ВыборкаНоменклатура = Результат. Выбрать( ОбходРезультатаЗапроса. ПоГруппировкам, "Номенклатура" ) ;
Пока ВыборкаНоменклатура. Следующий( ) Цикл
ОбластьНоменклатура. Параметры. Заполнить( ВыборкаНоменклатура) ;
ТабДок. Вывести( ОбластьНоменклатура) ;
Для обхода внутри номенклатуры всех складов, присутствующих в результате запроса, получим вложенную выборку от выборки номенклатуры, с указанием третьего параметра "ВСЕ":
Код 1C v 8.х ВыборкаСклад = ВыборкаНоменклатура. Выбрать( ОбходРезультатаЗапроса. ПоГруппировкам, "Склад" , "ВСЕ" ) ;
Пока ВыборкаСклад. Следующий( ) Цикл
ОбластьСклад. Параметры. Заполнить( ВыборкаСклад) ;
ТабДок. Присоединить( ОбластьСклад) ;
КонецЦикла ;
В случае если необходимо построить несколько отдельных кросс-таблиц для каждого значения некой группировки, необходимо в качестве третьего параметра выборки указать имя группировки, внутри которой необходимо получить все значения, вошедшие в запрос .
Пример:
Код 1C v 8.х ВыборкаСклад = ВыборкаНоменклатура. Выбрать( ОбходРезультатаЗапроса. ПоГруппировкам, "Склад" , "Организация" ) ;
В данном примере будут получены все значения складов, присутствующие в ранее выбранной организации.
Категория:
Запросы Дополнение результата запроса Датами в Установленном ПЕРИОДЕ Иногда возникает необходимость вывести в отчет информацию таким образом, чтобы некоторые итоговые значения были рассчитаны на каждую дату в заданном интервале с указанной периодичностью. Например, требуется получить обороты по неделям вне зависимости от того, были ли обороты в конкретную неделю или нет. Для решения подобной задачи в языке запросов предусмотрена конструкция ПЕРИОДАМИ. Данная конструкция указывается в предложении ИТОГИ после поля "Период". После ключевого слова ПЕРИОДАМИ в скобках указывается вид периода (одно из Секунда, Минута, Час, День, Неделя, Месяц, Квартал, Год, Декада, Полугодие), начальная и конечные даты интересуемого периода. В случае если начальные и конечные даты не указаны, будут использованы первая и последняя даты, участвующие в результате.
Пример:
Код 1C v 8.х ВЫБРАТЬ
УчетНоменклатурыОбороты. Период КАК Период,
УчетНоменклатурыОбороты. КоличествоОборот КАК КоличествоОборот
ИЗ
РегистрНакопления. УчетНоменклатуры. Обороты( , , Неделя, ) КАК УчетНоменклатурыОбороты
УПОРЯДОЧИТЬ ПО
Период
ИТОГИ СУММА( КоличествоОборот) ПО
Период ПЕРИОДАМИ( НЕДЕЛЯ, , )
Результат данного запроса будет дополнен записями на даты начала каждой недели.
Заметим, что так как для дополненных периодов в результате запроса отсутствуют детальные записи, то дополненные записи будут получаться из выборки только в том случае, если при обходе выборки будут получаться все периоды, участвующие в запросе, что достигается установкой третьего параметра функции "Выбрать" результата запроса.
Пример:
Код 1C v 8.х ВыборкаПериод = Результат. Выбрать( ОбходРезультатаЗапроса. ПоГруппировкам, "Период" , "ВСЕ" ) ;
Пока ВыборкаПериод. Следующий( ) Цикл
ОбластьПериод. Параметры. Заполнить( ВыборкаПериод) ;
ТабДок. Вывести( ОбластьПериод, ВыборкаПериод. Уровень( ) ) ;
КонецЦикла ;
Категория:
Запросы Выгрузка результата запроса в Таблицу и Дерево значений Результат запроса может быть выгружен в таблицу значений или дерево значений с помощью метода Выгрузить. Затем над ними могут быть произведены другие операции: сортировка, свертка, перебор строк и другие действия.
Следующий пример
выгружает результат запроса в таблицу значений с прямым порядком обхода строк:
Код 1C v 8.х Результат = Запрос. Выполнить( ) ;
СпособОбхода = ОбходРезультатаЗапроса. Прямой;
ТабЗнач = Результат. Выгрузить( СпособОбхода) ;
Если используется иерархический обход результата запроса или обход по группировкам, тогда удобнее выгрузить не в таблицу значений, а в
дерево значений , как делается в следующем примере:
Код 1C v 8.х Результат = Запрос. Выполнить( ) ;
СпособОбхода = ОбходРезультатаЗапроса. ПоГруппировкамСИерархией;
Дерево = Результат. Выгрузить( СпособОбхода) ;
Категория:
Запросы Как вывести в справочник в виде дерева значений Код 1C v 8.х
Дерево = Новый ДеревоЗначений;
Запрос = Новый Запрос;
Запрос. Текст= "ВЫБРАТЬ
|Ном.Ссылка как ссылка
|ИЗ
| Справочник.Номенклатура КАК Ном
|Упорядочить По
|Ном.Ссылка Иерархия" ;
Запрос. Текст= "ВЫБРАТЬ
|Ном.Ссылка как ссылка
|ИЗ
| Справочник.Номенклатура КАК Ном
|ИТОГИ ПО
|Ном.Ссылка ТОЛЬКО ИЕРАРХИЯ" ;
Дерево = Запрос. Выполнить( ) . Выгрузить( ОбходРезультатаЗапроса. ПоГруппировкамСИерархией) ;
ТабличноеПолеТипаДерево = Дерево;
ЭлементыФормы. ТабличноеПолеТипаДерево. СоздатьКолонки( ) ;
Категория:
Работа с Деревом Значений