Как удалить записи в периодическом независимом регистре сведений?
Удаление всех записей периодического независимого регистра сведений выполняется так же, как и для непериодического независимого регистра сведений:
НаборЗаписей = РегистрыСведений.КурсыВалют.СоздаіьНаборЗаписейО; НаборЗаиисей. Заііисать();
Создаем переменную «НаборЗаписей» как набор записей регистра сведений. Поскольку мы не прочитали данные из регистра - в этот момент это пустой набор записей.
Записываем новый набор записей (пустой) с замещением всех предыдущих записей (по умолчанию параметр «Замещать» метода Записать() имеет значение Истина).
Замечание: данную технологию можно применять только для регистров сведений с независимым режимом записи.
Как в периодическом независимом регистре сведений «КурсыВалют» удалить все записи по валютам с наименованиями «EUR» и «USD», период которых меньше 01 января 2005 года?
Один великий скульптор на вопрос «Как вам удалось создать такой шедевр?» ответил: «Отсек все лишнее!».
Примем на вооружение метод, но... перевернем его. В данной задаче у нас просят отсечь все лишнее, а решить ее можно - оставив все нужное.
Поэтому сначала получим таблицу записей, которые необходимо оставить. Поскольку условий несколько, да еще и не все они на равенство - оптимальнее это сделать при помощи запроса.
Следующий запрос даст нам желаемое:
Запрос = Новый Запрос;
Заирос.Тскст = "ВЫБРАТЬ
I *
|ИЗ
I РегистрСведений.КурсыВалют КАК КурсыВалют |ГДЕ
I (КурсыВалют.Период >= ДАТАВРЕМЯ(2005. 1.1)
I ИЛИ
I НЕ(Курсы Вал ют. Вал юта. Наименование ПОДОБНО ""USD"")
I И
I НЕ(КурсыВалют.Валюта.Наименование ПОДОБНО ""EUR""))'
Источником данных для запроса послужила таблица записей регистра.
Были применены отборы, чтобы в результат попали записи, для которых период более или равен 01 января 2005 года или наименования не «USD» и не «EUR». Обратите внимание, при составлении условия по периоду, чтобы не пользоваться параметром запроса, прямо в тексте запроса применили литерал даты ДАТАВРЕМЯ(), в котором части даты указываются в «обратном» порядке: год, месяц, порядковый номер дня в месяце.
Результатом запроса будет таблица, в которой по каждой записи заполнены все поля регистра сведений «КурсыВалют».
ТаблицаОставляемыхЗаписсй = Запрос. Выполнить().Выгруэить();
НаборЗаписсй = РегистрыСведений.КурсыВалют.СоздатьНаборЗапнсей();
НаборЗаписсй.Загрузить(ТаблицаОставляемыхЗаписей):
НаборЗаписей.ЗаписатьО;
Далее запрос выполняем, выгружаем результат в таблицу значений «Т аблицаОставляемыхЗаписей».
Создаем переменную «НаборЗаписей», тип значения РегистрСведенийНаборЗаписей.КурсыВалют, выгружаем в нее таблицу значений «ТаблицаОставляемыхЗаписей».
Поскольку сама таблица была получена из регистра - то названия ее колонок совпадут с названиями полей регистра - а значит, загрузка пройдет успешно.
Далее записываем заполненный только нужными записями набор записей в регистр с замещением его исходных данных (как Вы уже помните, параметр «Замещать» метода Записать() по умолчанию имеет значение Истина).
Замечание: данная задача не может решаться без комплексного рассмотрения вопроса устойчивости и целостности базы данных, поскольку на данные регистра могут быть «завязаны» учетные механизмы конфигурации.
Как прочитать данные, актуальные на определенную дату, из регистра сведений «Курсы валют» с отбором по нескольким валютам (отбор по измерениям)?
Для решения данной задачи удобнее всего использовать запрос. Например:
Запрос = Новый Запрос:
МассивВалют = Новый Массив:
МассивВалют.Добавить( Валюта 1);
МассивВалют.Добавить( Вал юта2):
Запрос.УстановитьПарамстрС’МассивВалют", МассивВалют); Запрос.УстановитьІ Іарамстр( "ДатаПолучения", ДатаПолучения);
Заирос.Текст = "
ІВЫБРАТЬ
I ВалютыСрезПоследних.Валюта.
I ВалютыСрезПоследних.Курс |ИЗ
I Регистреведений.КурсыВалют.СрезПоследних(&ДатаПолучения.
Валюта В (&МассивВалют))
КАК ВалютыСрезПоследних";
ТаблицаКурсов = Запрос.Выііоііниіь().Выгрузить));
Создаем запрос. В качестве параметров запроса передаем массив валют, по которым мы хотим получить данные и значение даты, на конец которой нужно получить срез последних.
Запрос строим по виртуальной таблице
«РегистрСведений. КурсыВалют. СрезПоследних» регистра
«КурсыВалют». В качестве параметров виртуальной таблицы указываем дату построения и условие по измерению валюта (значения измерения должны входить в переданный массив).
Как поменять период у записей периодического независимого регистра, соответствующих ряду условий?
В периодическом независимом регистре сведений «ОтветственныеЛицаОрганизации» все записи, касающиеся организации с наименованием «Групи-трейдинг», период которых меньше 01 января 2005 года необходимо перенести на 01 января 2004 года. Но записи с указанием должностей «Продавец» и «Кладовщик» должны остаться на своих местах.
Структура регистра следующая:
Ответственные Л ицаО рг «ни зацим . Измерения
і 1—t . СтруктурнаяЕдиннца ! I— I. ОтветственмоеЛ то В С Ресурсы
І— і Физическое Лицо Должность
Измерение «СтруктурнаяЕдиница» имеет тип значения СправочникСсылка.Организации.
Для периодического независимого регистра сведений модифицировать (и удалять) записи можно только посредством объекта РегистрСведенийНаборЗаписей.<имя> или
РегистрСведенийМенеджерЗаписи.<имя>.
И в том и в другом случае понадобится работать с отборами по периоду (обязательно) и по измерениям (желательно, в зависимости от контекста задачи).
Поэтому сначала получим таблицу записей, которые подлежат модификации. Поскольку условий несколько, да еще и не на равенство -оптимальнее это сделать при помощи запроса. А потом, перебирая результат запроса, добьемся требуемого результата:
Процедура ЗаменаІ 1ериода()
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ I ОтветственныеЛицаОрганизации.Период.
I ОтветственныеЛицаОрганизации.Структурная Единица. I ОтветственныеЛицаОрганизации.ОтветственноеЛицо |ИЗ
I РегнстрСведенин.ОтветственныеЛнцаОрганизации
КАК ОтветственныеЛицаОрганизации
|ГДЕ
I ОтветственныеЛицаОрганизации.Период <= ДАТАВРЕМЯ(2005, 1, 1)
I И
I ОтветственныеЛицаОрганизации.СтруктурнаяЕдиница.Наименование
ПОДОБНО Трупп-Трейдинг' I И
I (ОзветсгвенныеЛицаОртапизацни.Должиость.Наименование ЕСТЬ NULL ИЛИ
I НЕ(ОтветственныеЛнцаОрі анизации. Должность. Наименование
ПОДОБНО "Продавец"
ИЛИ
ОтветственныеЛицаОрганнзации.Должность.Наимснованис
ПОДОБНО "Кладовщик"))”:
Результат = Запрос.Выполнить():
Выборка = Результат.ВыбратьО;
Запись = РегистрыСведений
.ОтветственныеЛицаОрганизации
.СоздатьМенеджерЗаписиО:
Пока Выборка.СледующийО Цикл Запись. I Іериод = Выборка.Период;
Запись.СтруктурнаяЕдиница = Выборка.С'ірукгурнаяЕднница: Запись.ОтветственноеЛнцо = Выборка.ОтветственноеЛ ицо;
Запись.Прочитать));
Если Запись. Выбран)) Тогда Запись.Период = Дата(2004,1,1);
3апись.3аписать();
КонецЕсли;
КонецЦикла;
КонецПроцедуры;_
Результат запроса - таблица, в которой по каждой записи заполнены все поля измерений из регистра и поле «Период». Именно эту информацию мы используем для получения каждой нужной записи.
Источником данных для запроса послужила таблица «РегистрСведений. ОтветственныеЛицаОрганизации».
Были применены отборы так, чтобы в результат попали записи с периодом менее 1 января 2005 года, наименование структурных единиц, в которых - «Групп-трейдинг», а наименования должностей не относятся к «Продавец» и «Кладовщик». Кроме того, необходимо позаботиться о
случае, когда должность вообще не указана - то есть ее наименование имеет значение NULL. Такие записи тоже нужно будет переносить.
Запрос выполнен, далее перебирая его результат и посредством менеджера записи регистра «ОтветственныеЛицаОрганизации» добиваемся желаемого. При каждом проходе никла считываем очередную запись, предварительно указав значение ее поля «Период» и полей измерений.
Далее меняем значение поля «Период» у считанной записи и записываем ее в регистр.
Как «сделать периодическим» реквизит уже заполненного справочника?
У справочника «Проекты» есть реквизит «Ответственный» (тип значения - СправочникСсылка. Пользователи). Необходимо обеспечить в системе возможность «перезакрепления» проектов за ответственными с сохранением истории значений с точностью до дня.
Для хранения истории значений периодических данных в системе «1С:Предприятие 8.0» используют регистры сведений.
Поэтому для красивого решения нашей задачи понадобится
выполнить следующие шаги:
Создать в системе периодический регистр сведений
«ЗакреплениеПроектов».
Создать и выполнить обработку, которая заполнит новый регистр информацией из уже заполненных элементов справочника.
Проконтролировать и обеспечить корректность работы всех механизмов системы, использовавших реквизит «Ответственный» справочника «Проекты». Для поиска таких механизмов можно, например, воспользоваться командой «Правка | Глобальный поиск ...». Корректность необходимо проверять по поводу последующего хранения информации об ответственных в периодическом регистре сведений и по поводу последующего удаления реквизита «Ответственный» из справочника «Контрагенты».
Удалить реквизит «Ответственный» из структуры справочника «Проекты».
Обеспечить удобство для пользователей визуализации, ввода и редактирования информации об ответственных за проекты. В самом простом для разработчика случае - можно просто убедиться в доступности кнопки «Перейти» в командных панелях формы списка и формы элемента справочника «Проекты».
Рассмотрим первые два шага более подробно:
1) Создание периодического регистра сведений.
Если не требуется регистрировать факты
закрепления/перезакрепления посредством специального документа -режим записи регистра будет «Независимый». Периодичность регистра определяется спецификой бизнес-процессов автоматизируемого предприятия, в нашем случае - «День».
Поскольку по каждому проекту в конкретный момент времени будет один ответственный — то структура регистра будет следующей:
В ? ЗекрепленмеЛроектов В * Иэмеретыя *• . Проект f
u Ресурсы *— j; Ответствен****
3 Реквизиты
Тип значения измерения «Проект» - СправочникСсылка.ПрОбКТЫ. Не забудьте указать для данного измерения свойство «Ведущее», тогда при удалении проектов будут автоматически удалены и соответствующие им записи регистра сведений. Тип значения ресурса «Ответственный» -СправочникСсылка. Пользователи.
2) Обработка заполнения регистра по существующим данным справочника.
Код этой обработки может выглядеть следующим образом:
Запрос - Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ I &ДатаУстановкм КАК Период,
I Проекты.Ссылка КАК Проект,
I Проекты.Ответственный |ИЗ
I Справочник.Нроекты КАК Проекты |ГДЕ
I (НЕШроекты.'ЗгоГ руппа)) И (НЕ(Проекты.Ответственный = «^Ответственный))"
Запрос.УстановитьПараметр('Ответственный',
Справочники.Пользе ватели.ПустаяСсылкаО);
Запрос. УстановнтьПараметрС'ДатаУстановки", Дата(2000,1.1));
ТаблицаРезультат = Запрос.ВыполнитьО.ВыгрузитьО;
НаборЗаписей = РеіистрыСведений.ЗакреплениеПроектов.СоздатьНаборЗаписейО: НаборЗаписей.Загрузить(ТаблицаРезультат);
I ІаборЗап исей .Записать();
Имеет смысл выполнять обработку только по элементам справочника «Проекты» (по группам не нужно) и только по тем элементам, у которых заполнен реквизит «Ответственный». Получение необходимой информации организуем посредством запроса.
Источником данных для него будет таблица «Справочник.Проекты». Применяем вышеописанные условия. Состав и псевдонимы выходных полей запроса делаем соответствующим составу и именам полей записей регистра.
Поскольку невозможно в периодический регистр сведений внести записи с пустым значением поля «Период», и в справочнике не хранилась информация, с какого момента были закреплены ответственные за проектами - через параметр запроса назначаем значение периода заведомо предшествующее началу работы с нашей базой.
Результат выполнения запроса выгружаем в таблицу значений «Т аблицаРезул ьтат».
Далее создаем переменную «НаборЗаписей» соответствующего типа значения.
Поскольку имена полей записей регистра совпадают с названием колонок таблицы - таблицу значений «ТаблицаРезультат» загружаем в набор записей регистра «ЗакреплениеПроектов».
Далее записываем заполненный набор записей.
Обратите внимание, что в нашем случае набор записей регистра создавался без отборов и у метода Записать() значение параметра «Замещать» было опущено (значит, по умолчанию равно Истина). В результате, даже если какие-то записи существовали в регистре до начала выполнения обработки, - они будут полностью замещены новыми, сформированными обработкой. Подобное действие (замещение всех записей регистра) возможно только для регистров сведений с режимом записи «Независимый» (то есть, не подчинены регистратору).
Если регистр сведений подчинен регистратору, то для добавления записей в такой регистр необходимо создать набор записей этого регистра с установленным отбором по нужному регистратору, заполнить этот набор записей и записать его:
НаборЗаписей = РегистрыС ведений
.ЛнмитыВотвратнонТары
•СоздатьНаборЗаписейО;
НаборЗаписей.Отбор. Регистратор.Установить(ВыбранныйРегистратор);
НоваяЗапись = НаборЗаписей.Добавить();
НоваяЗапись. Период = ВыбранныйРегистратор.Дата:
Новая Запись. Номенклатура = ВыбраннаяНоменклатура: НоваяЗапись.ДоговорКонтрагента = ВыбранныйДоговор; НоваяЗапись.ЛнмитПоставщика = 50;
НаборЗал леей. Записать!):
По-умолчанию запись выполняется с замещением, т.е. существующие записи этого регистратора в регистре сведений будут удалены.
Для того чтобы добавить записи к существующим записям регистратора, необходимо указывать значение ЛОЖЬ параметра метода Записать() набора записей. При этом необходимо позаботиться о том, чтобы значения измерений добавляемых записей были уникальны для записей данного регистратора в регистре сведений, иначе запись выполнена не будет:
НаборЗаписей = РсгистрыСвсдений
.Л нмитыВотвратнойТ ары .СочдатьНаборЗаписейО:
НаборЗаписей. Отбор. Регистратор. Установить! Выбранный Регистратор):
НоваяЗапись = НаборЗаписей .ДобавитьО;
НоваяЗапись.Период = ВыбранныйРегистратор.Дата; НоваяЗапись.Номенклатура = ВыбраннаяНоменклатура; НоваяЗапись.ДоговорКонтрагента = ВыбранныйДоговор:
Новая Запись-ЛимитПокупателю = 25;
НаборЗаписей. Записать(Ложь);
Для того чтобы прочитать данные регистра сведений, подчиненного регистратору, необходимо создать набор записей, установить отбор по регистратору и затем выполнить метод Прочитать() набора записей регистра сведений. После этого можно перебрать записи набора в цикле и выполнить необходимые изменения.
В примере ниже представлен вариант чтения данных регистра сведений «ЦеныНоменклатуры» для документа
«ВыбранныйРегистратор», сообщение данных полей каждой записи и обнуление процента скидки для записей этого документа в регистре сведений:
НаборЗапнсей = РегистрыСведений.ЦеныНоменклатуры.('оздатьНаборЗаписей():
НаборЗаписей.Отбор.Регистратор.Установить(ВыбранныйРегистратор);
НаборЗапнсей. Прочитать));
Для Каждого Запись Из НаборЗапнсей Цикл
// Чтение и сообщение данных полей записи. Сообщить(Строка(Запись.Период) + "" +
Строка(Запнсь.ТипЦен) +" ’’+
Строка)Запись.Номенклатура) + " " +
С грока(Запись.Цена) + " ” + Строка(Замнсь.ПроцентСкидкиНаиенки));
// Изменение данных полей записи.
Запись.ПроцентС кидкиНацснки = 0;
КонецЦикла;
НаборЗапнсей.Записать)):
Прежде всего, следует оценить необходимость решения такой задачи. Если записи в регистр попадают при проведении регистраторов, и у документов-регистраторов свойство «Удаление движений» имеет значение «Автоматическое удаление движений» - то достаточно просто отменить проведение всех регистраторов - и движения будут удалены из регистра. Именно такая картина наблюдается в большинстве случаев.
Если же задача заключается в очистке таблицы записей регистра в некоторых регламентных целях, можно поступить следующим образом:
Запрос = Новый Запрос:
Запрос.Тскст ="
|ВЫ БРАТЬ
I ЦеиыНоменклатурыКонтрагентов.Регистратор |ИЗ
I РегистрСведений.ЦеныНоменклатурыКонтрагентов КАК ЦсныНомснклатурыКонтрагентов";
Результат = Запрос.ВыполнитьО:
Выборка = Результат.ВыбратьО;
НаборЗаписей = РегистрыСведений
.ЦсныНомснклатурыКонтрагентов
.СоздатьНаборЗаписейО:
Пока Выборка.СледующийО Цикл
НаборЗап исей.Отбор. Регистратор. Установить! Выборка. Регистратор); НаборЗаписей.Записать();
КонецЦикла;
Сначала запросом получаем выборку всех документов, являющихся регистраторами для нужного регистра.
Далее создаем набор записей по данному регистру.
В цикле перебора выборки из результата запроса - устанавливаем отборы для набора записей по нужным регистраторам и записываем пустые наборы записей в регистр с замещением старых наборов.
Бухгалтерский учет
© Как в регистре бухгалтерии сформировать проводки?
Допустим, требуется сформировать следующую проводку для операции оплаты поставщику:
Счет дебета |
60.01 |
Контрагент |
LIGHT |
Договор |
Основной договор |
Документ |
Документ расчета с контрагентами №2 |
Счет кредита |
51 |
Банковский счет |
р/с завода Инвестспецбанк |
Статья движения денежных средств |
Оплата за оборудование |
Сумма |
300 000 |
Содержание |
Оплата поставщику |
Номер журнала |
БК |
Согласно этим данным, проводка должна быть сформирована по регистру бухгалтерии «Хозрасчетный»:
0 Щ Хозрасчетный Измерения j— L* Организация
=.....I— Валюта
Й ¦Ресурсы I Сумма
і ВалютнаяСумма I Количество В S Реквизиты
— Содержание — НомерЖурнала
Данную задачу можно решить следующим образом: |
// Задать выбираемые значения. ВыбранныйОтветственный = Справочники |
|
.Пользователи |
|
.НайтиПоНанменованию(" Иванцова"): |
Выбранный Контрагент = Справочники.Контрагенты. Пай |
гиПоКоду("00027"): |
|
ВыбранныйДоговор = Сі іравочники.Договоры Контрагентов. НайтиІІоКодуС'ООО 13”); ВыбранныйДокумент = Документы
.ДокументРасчетовСКонтрагентом .НайтиПоНомеру(2, '2005010Г);
ВыбранныйСчет = Справочники.БанковскиеСчета.НайтнПоКодуС'00001 ВыбраннаяСтатья = Справочники
.СтатьиДвиженияДенежныхСредств
.НайтиПоКодуС00002
п);
ВыбраниаяОрганитация = Справочники.Организации.НайтиПоКодуС'ООООГ'): Выбранная Валюта = Справочники. Валюты. НайтиПоКоду(8І0);
// Создать будущий рег истратор.
ДатаЗаписи = ТекущаяДатаО;
Документ = Документы.ОперацияБух.СоздатьДокументО;
Документ.Дата = ДатаЗаписи;
Документ.Организация = ВыбраннаяОртанизация:
Документ.Ответственный = ВыбранныйОтветственный;
Документ.Содержаніге = "Оплата поставщику";
Документ.ЗаписатьО;
// Создать набор записей.
НаборЗапнсей = РетистрыБухгалтерни.Хозрасчетный.СоздатьНаборЗаписейО; ІІаборЗаписсй.Отбор.Регнстратор.Установить(Документ.Ссылка);
Движение = НаборЗаписей.ДобавитьО;
Движеггие.Ретистратор = Документ.Ссылка;
Движение.Пернод = ДатаЗаписи:
// Заполнить счет дебета.
Движение.СчетДт = ПланыСчетов.Хозрасчетный.НайтиПоКодуС'60.01 // Заполнить аналитику счета дебета.
Движение.СубконтоДт.Контрагенты = ВыбранныйКонтрагент; Движение.СубконтоДт.Договоры = ВыбранныйДоговор;
Движение.СубконтоДт.ДокументыРасчетовСКонтрагентами= ВыбраггныйДокумент; // Заполнить счет кредита.
Двнжение.СчетКт = ПланыСчетов.Хозрасчетный.НайтиПоКоду("5Г');
// Заполнить аналитику счета кредита.
Движение.СубконтоКт.БанковскиеСчета = ВыбранныйСчет; Движение.СубконтоКт.СтатьиДвиженияДенежныхСредств = ВыбраннаяСтатья:
// Балансовое измерение.
Движенис.Организация = ВыбраннаяОртанизация;
// Балансовый ресурс.
Движение.Сумма = 300000; ,
// Реквизиты.
Движсние.НомерЖурнала = "БК"; Движение.Содержанне = "Оплата поставщику'
// Записать набор 'записей.
НаборЗаписей.Записать();
Внести информацию в регистр бухгалтерии без привязки к документу-регистратору невозможно. Поэтому, например, в составе типового решения «Бухгалтерия предприятия» для работы с так называемыми «ручными операциями» существует документ «ОперацияБух». Его задача - выступать в качестве регистратора в подобных случаях.
Итак, сначала создаем новый документ «ОперацияБух», в качестве его даты прописываем, например, текущую дату, записываем данный документ в базу данных. Далее создаем объект набор записей по нужному нам регистру. Устанавливаем отбор по созданному регистратору. После этого добавляем новую запись к набору записей и заполняем ее поля данными. По окончании цикла выполняем запись сформированного набора записей.
Как получить остаток по счету?
Получим остатки по счету «Товары на складах» в разрезе организаций и товаров (Субконто 1). Для этой цели можно использовать следующий запрос к виртуальной таблице остатков регистра бухгалтерии «Хозрасчетный» :
Запрос = Новый Запрос;
Запрос.Текст = ”
|ВЫ БРАТЬ
I ХозрасчетныйОстатки.СубконтоІ,
I ХозрасчстныйОстатки.Организация.
I ХозрасчстныйОстатки.СуммаОстаток,
I ХозрасчстнынОстатки.КоличествоОстаток |ИЗ
I РегистрБухгалтерии.Хозрасчетный.Остатки(&Период. Счет = &Счет,.)
I КАК ХозрасчетныйОстатки": '
Запрос.УстановитьПараметрС'Нериод", КонецДня(ДатаОтчета));
Запрос. УстановнтьПараметрС’Счет”,
ПланыСчетов.Хозрасчетный ТоварыНаСкладах): РезультатЗапроса = Запрос. ВыполнитьО;
В качестве параметров запроса устанавливаются необходимый счет («ТоварыНаСкладах») и дата, на которую надо получить остатки.
Как получить обороты по счету?
Получим обороты по счету «Товары на складах» за указанный интервал дат (переменные «НачПериода» и «КонПериода»).
Для этой цели можно использовать следующий запрос к виртуальной таблице оборотов регистра бухгалтерии «Хозрасчетный» :
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ I ХозрасчетныйОбороты.СуммаОборотДт,
I ХозрасчетныйОбороты.С?ммаОборотКт |ИЗ
I РегистрБухгалтерии.Хозрасчетный.Обороты(&НачПериода, &КонІ1ериода,
Период, Счет = &Счет,,,,)
I КАК ХозрасчетныйОбороты";
Запрос.УстановитьПараметрС'НачПериода", НачПериода); Запрос.УстановитьПараметр( "КонПериода". КонПериода);
Запрос. УстановитьПараметрС'Счст",
ПланыСчетов.Хозрасчетный.ТоварыНаСкладах);
РезультатЗапроса = Запрос. Выполнить));
В качестве параметров запроса устанавливаются необходимый счет («ТоварыНаСкладах») и даты начала и конца периода, за который нужно получить обороты.
Как получить остатки по счетам?
Необходимо получить данные о валютных активах компании в разрезе счетов и валют.
Для решения задачи можно использовать следующий текст запроса:
"ВЫБРАТЬ
I ХозрасчстныйОстатки.Счет.
I ПРЕДСТАВЛЕНИЕ(ХоэрасчетныйОстатки.Счет),
I ХозрасчетныйОстатки.ВалютнаяСуммаОстатокДт КАК ВалютнаяСуммаОстатокДт,
I ХозрасчетныйОстатки.Счет.Порядок КАК СчетПорядок. I ХозрасчетныйОстатки.Валюта КАК Валюта.
I ПРЕДСТАВЛЕНИЕ(ХозрасчетныйОстатки.Валюта)
|ИЗ
I РегистрБухгалтерии.Хозрасчетный.Остатки(&Дата.
Счет.Валютный И Счет.Вид = &Активный..)
КАК ХозрасчетнынОстатки
ІУПОРЯДОЧИТЬ ПО I СчетПорядок
Іитоги
I СУММА(ВалютнаяСуммаОстатокДт)
|ПО
I Валюта";
Необходимо определить следующие параметры:
Запрос.УстановнтьПарамстрГ’Активный", ВидСчета.Активный): Запрос.УстановнтьПарамстрСДата". Дата);
Фактически идет обращения к дебетовым остаткам счетов являющихся активными и по которым ведется валютный учет.
Как перенести остаток со счета на счет?
Необходимо реализовать механизм, позволяющий списать дебиторскую задолженность по указанному контрагенту и договору взаиморасчетов с ним.
Запрос = Новый Запрос:
Запрос.Текст = "ВЫБРАТЬ I ХозрасчетныйОстатки.СуммаОстатокДт |ИЗ
I РегистрБухгалтерии.Хозрасчетный.Остатки(&Период,
Счет = &Счст.,
Субконто I = &Контрагент И Организация = &Организация И Субконто2 = &Договор)
I КАК ХозрасчетныйОстатки";
//Считаем что на счете ведется аналитика только в разрезе контрагентов // и договоров.
Запрос.УстановитьПараметрС'Период", Период 1);
Запрос.УстановитьПараметрС'Контрагент", Контрагент); Запрос.УстановитьПараметрС'Договор", Договор); Запрос.УстановитьПараметрС'Организация". Организация); Запрос.УстановнтьПараметрС'Счет".
ПланыСчетов.Хозрасчетный РасчетыСПокупателями):
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.СледуюшийО Тогда Документ = Документы.ОнерашіяБух.СоздатьДокумснтО:
Документ.Дата = РабочаяДата;
Документ.Организацня = Организация:
Документ.Содержание = "Погашение дебиторской задолженности";
Проводка = Документ.Движения.Хозрасчетный.ДобавитьО; Проводка.СчетДт = ПланыСчетов.Хозраечетный.РасчетыСПокупателями; Проводка.СчетКт = ПланыСчетов.Хозрасчетный.ПрочиеРасходы; Проводка.СубконтоДт.Контрагенты = Контрагент; Проводка.СубконтоДт.Договоры = Договор;
Ироводка.Сумма = Выборка.СуммаОстатокДт;
Документ.СуммаОперации = Выборка.СуммаОстатокДт;
Форма = Документ.ПолучитьФормуч):
Форма.ОткрытьО;
КонецЕсли:
В обработке используется документ «ОперацияБух» являющийся по смыслу ручной операцией. С его помощью можно сформировать любую проводку.
Как найти первый документ, приведший к появлению кредитового остатка на счете?
Применение виртуальной таблицы «ОстаткиИ Обороты» с соответствующим заполнением параметра «Периодичность» позволяет решить задачу:
ВЫБРАТЬ ПЕРВЫЕ 1
ХозрасчетныйОстаткиИОбороты.Регистратор КАК Регистратор ИЗ
РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&ДатаН.
&ДатаК. Регистратор,, Счет = &Счет,,)
КАК ХозрасчетныйОсіаткнИОбороты
ГДЕ
ХозрасчстныйОстаткиИОбороты.СуммаКонечныйОстатокКт > О УПОРЯДОЧИТЬ ПО ХозрасчегныйОстаткиИОбороты.Период,
Регистратор
таблицу
за
Используем виртуальную
«РегистрБухгалтерии.Хозрасчетный. ОстаткиИ Обороты»
определяемый пользователем период (ДатаН и ДатаК), с периодичностью по регистратору и отбором по указанному счету.
Накладываем условие - кредитовый остаток счета больше нуля.
Упорядочиваем результат по периоду, затем по регистратору. Это важно потому, что по умолчанию таблица упорядочена не будет. Кроме того, обратите внимание - первичен в упорядочивании период, и только при совпадении периодов дальнейшее упорядочивание идет по регистратору.
Посредством ключевых слов ВЫБРАТЬ ПЕРВЫЕ 1 обеспечиваем, чтобы в результат запроса попала только первая запись.
Как выбрать все счета, в аналитике которых присутствуют либо вид субконто «Контрагент», либо вид субконто «Договор»?
Данную задачу можно решить посредством запроса:
ВЫБРАТЬ
Хозрасчет ныйВндыСубконто.Ссылка как Счет ИЗ
ПланСчетов. Хозрасчетный. ВидыСубконто КАК ХозрасчетныйВидыСубконто ГДЕ
ХозрасчетныйВидыСубконто.ВидСубконто.Наименование
В ("Договоры". "Контрагенты")
Источник - таблица «ВидыСубконто» требуемого плана счетов (в нашем случае «Хозрасчетный»). Выходным полем делаем поле «Ссылка», присутствующее в записях этой таблицы. Накладываем условие отбора на вхождение в список, состоящий из наименований нужных нам видов субконто. В результате получаем счета.
Как выбрать все счета, в аналитике которых присутствуют как вид субконто «Контрагент», так и вид субконто «Номенклатура»?
Данную задачу можно решить посредством запроса:
ВЫБРАТЬ
ХозрасчсгныйВидыСубконто.Ссылка КАК Счет ИЗ
ПланСчетов. Хозрасчетный. ВидыСубконто КАК ХотрасчетныГіВидыСубконто ВНУТРЕННЕЕ СОЕДИНЕНИЕ
ПланСчетов.Хозрасчетный.ВидыСубконто КАК ХозрасчетныйВндыСубконтоІ ПО
ХозрасчетныйВндыСубконто.Ссылка = ХозрасчетныйВндыСубконтоІ .Ссылка
ГДЕ
(ХозрасчетнынВидыСубконто.ВидСубконто. Наименование = "Контрагенты")
И
(ХозрасчетныйВндыСубконтоІ .ВидСубконто.Наименование = "Номенклатура")
Выполняем внутреннее соединение двух таблиц «ВидыСубконто» плана счетов «Хозрасчетный» по равенству полей «Ссылка». Посредством отбора в запросе останутся только те записи, у которых поле «Наименование» вида субконто первой таблицы равно «Контрагенты», а второй - «Номенклатура». Выходное поле - «Ссылка». Это ссылки на нужные счета.
Как добавить новый вид субконто к счету?
Необходимо к счету с кодом «90.01.1» плана счетов «Хозрасчетный» добавить новый оборотный вид субконто «Менеджеры»: тип значения -«СправочникСсылка.Пользователи», признак - «Суммовой».
Обычно такая задача решается интерактивными средствами в режиме «1С:Предприяте» или, если счет предопределенный, можно так же в режиме «Конфигуратор».
В любом случае сначала надо убедиться, что в состав свойства Тип значения характеристик плана видов характеристик,
предназначенного для хранения видов субконто, входит справочник « Пользователи»:

Если же это необходимо все же выполнить именно в обработке, можно сделать и так:
ВидМенеджеры = ПланыВидовХарактеристик |
|
ВндыСубконтоХозрасчетныс |
|
.НайтнПоНаименованикИ "Менеджеры", |
Истина): |
// Добавить новый вид характеристик. |
|
Если ВидМенеджеры.ПустаяО Тогда |
|
ВидМенеджеры = ПланыВидовХарактеристик |
|
.ВидыСубконтоХозрасчетные |
|
.СоздатьЭлементІ): |
|
ВидМенеджеры.Наименование = "Менеджеры": |
|
ВндМенеджеры.ТипЗначения = |
|
Новый ОпнсаннеТиповС’СправочннкСсылка.Пользователи”); |
ВидМенеджеры.ЗаписатьО; |
|
КонецЕсли; |
|
// Получить нужный счет. |
|
Счет = ПланыСчетов.Хозрасчстный.НайтиПоКоду("90.()1. |
Г): |
Если (Не Счет.ПустаяО) И |
|
(Счет.ВндыСубконто.Найти(ВидМенеджеры) = Неопределено) Тогда |
// Добавить новый вид субконто к счету. * |
|
ОбъектСчета = Счет.ПолучитьОбъектО; |
|
НовыйВидСубконто = ОбъекгСчета.ВндыСубконто.ДобавитьО: |
НовынВидСубконто.ВидСубконто = ВидМенеджеры; |
|
НовыйВидСубконто.ТолькоОбороты = Истина; |
|
НовыйВидСубконто.Суммовой = Истина; |
|
ОбъектСчета. ЗапнсатьО; |
|
КонецЕсли; |
|
Сначала пытаемся найти в плане видов характеристик «ВидыСубконто» данной конфигурации найти вид «Менеджеры». Причем поиск осуществляем по полному совпадению наименования.
Если такового вида не найдено - создаем новый элемент в плане видов характеристик «ВидыСубконто». Устанавливаем его наименование и тип значения. Записываем.
Далее убеждаемся, есть ли в плане счетов «Хозрасчетный» счет с указанным кодом.
Если счет есть, и среди его видов субконто нет вида, соответствующего менеджерам, - будем его модифицировать. А значит, нужно сначала получить объект данного счета.
Далее добавляем новую строку в таблицу «ВидыСубконто» данного счета, прописываем в ней вид нужный вид субконто, ставим признаки «Суммовой» и «ТолькоОбороты».
Замечание: желательно заранее проконтролировать, какое
максимальное количество уровней субконто разрешено для данного плана счетов, чтобы не получилось, что добавление нового вида субконто приведет к превышению этого порога.
Как из регистра бухгалтерии «Хозрасчетный» получить обороты только по валютным счетам?
Структура регистра следующая:
Щ Хозрасчет»*)* Измерения |
 |
tm Ресурсы |
Е|
< ВалютмаяСумма J Количество
В s Реквизиты |
 |
Чтобы получить такую таблицу:
Организация |
Счет |
Валю
та |
СуммаОб
оротДт |
Валютна яСуммаО борот Дт |
СуммаОб
оротКт |
Валютна
яСумма
ОборотК
т |
МебельСт |
52 |
USD |
7596,16 |
260,00 |
|
|
МебельСт |
60.31 |
USD |
|
|
7697,23 |
265,00 |
МебельСт |
62.21 |
USD |
7596,16 |
260,00 |
7596,16 |
260,00 |
МебельСт |
62.31 |
USD |
65270,12 |
2269,75 |
56716,86 |
1969,75 |
МебельСт |
62.32 |
USD |
2879,10 |
100,00 |
9163,24 |
318,21 |
Нева ТД |
60.21 |
руб. |
|
|
59,00 |
59,00 |
Нева ТД |
60.31 |
USD |
63000,00 |
2187,96 |
82231,81 |
2847,00 |
Нева ТД |
60.31 |
EUR |
4463,78 |
122,30 |
4463,78 |
122,30 |
Нева ТД |
60.32 |
USD |
50000,00 |
1736,46 |
50000,00 |
1736,46 |
Нева ТД |
60.32 |
EUR |
560,11 |
15,69 |
|
|
Нева ТД |
62.31 |
USD |
3239,85 |
110,00 |
2500,00 |
84,77 |
Нева ТД |
76.35 |
USD |
|
|
142,25 |
5,00 |
Нева ТД |
76.39 |
USD |
|
|
2503,24 |
85,00 |
Можно воспользоваться запросом со следующим текстом:
ВЫБРАТЬ
ХозрасчетныйОбороты.Организацня КАК Организация, ХозрасчстныйОбороты.Счет КАК Счет. ХозрасчетныйОбороты. Валюта, ХозрасчстныйОбороты.СуммаОборотДт, ХозрасчетныйОбороты.Вал ютнаяСуммаОборотДт. ХозрасчетныйОбороты.СуммаОборотКт, ХозрасчетныйОбороты. ВалютнаяСуммаОборотКт ИЗ
РегистрЬухгалтерни.Хозрасчетный.Обороты(&ДатаНач.
&ДатаКон,. Счет.Валютный,.
КАК ХозрасчетныйОбороты
УПОРЯДОЧИТЬ ПО Организация,
ХозрасчетныйОбороты.Счет. Код
Источником является виртуальная таблица
«РешстрБухгалтерии.Хозрасчетный.Обороты» с установленными отборами по интервалу дат и признаку счета.
В качестве выходных полей указываем счета, значения измерений, дебетовый и кредитовый обороты ресурсов «Сумма» и « ВалютнаяСумма».
Полученную таблицу упорядочиваем по значению поля «Организация» и возрастанию кодов счетов.
Как выбрать в регистре бухгалтерии «Хозрасчетный» обороты по «60-ым» счетам, исключив внутренние обороты между ними?
Взаимными оборотами в данном случае могут являться случаи зачета авансов, уплаченных поставщику.
Решение данной задачи можно построить посредством запроса:
ВЫБРАТЬ
ХотрасчетныйОбороты.Счет,
Хо зрасче і ныйОбороты.СуммаОборотДт, ХозрасчетныйОбороты.СуммаОборотКт
т
РегистрБухгалтсрии.Хозрасчетный.Обороты(&ДатаНач,
&ДатаКон ,,
Счет В ИЕРАРХИИ (&Счет),,, НЕ(КорСчет В ИЕРАРХИИ (&Счет)). ) КАК ХотрасчетныйОбороты
УПОРЯДОЧИТЬ ПО ХозрасчетныйОбороты.Счет.Код
Источником будет виртуальная таблица
«РегистрБухгалтерии.Хозрасчетный.Обороты», с установленными отборами по интервалу формирования, по счету и по корсчету.
Условием по счету ставим вхождение в иерархию параметра запроса «Счет» (в него потом передадим ссылку на 60-ый счет).
Условием по корсчету ставим НЕ вхождение в иерархию параметра запроса «Счет».
Как реализовать метод «красного сторно» для регистра бухгалтерии?
Иногда требуется отменить в текущем отчетном периоде операцию, сделанную в прошлом отчетном периоде. Как этого добиться в отношении регистра бухгалтерии «Хозрасчетный»?
Для этого можно создать документ «Сторно». В его составе будет реквизит «СторнируемыйДокумент» (тип значения «ДокументСсылка»).
Далее, например, при проведении документа «Сторно», делаем выборку записей, связанных со сторнируемым документом и формируем на их основе сторнирующие записи:
Процедура ОбработкаПроведсния(Отказ, Режим)
СторнируемыеДвижсния = РегистрыБухгалтерии .Хозрасчетный
-ВыбратьПоРегистратору(СторнируемыйДокумент); Пока СторнируемыеДвнження.СледующийО Цикл
Проводка = Движення.Хозрасчетный.ДобавитьО:
Проводка.Период = Дата:
Проводка.СчетДт = СторннруемыеДвижения.СчетДт;
Проводка.СчетКт = СторнируемыеДвижения.СчетКт;
Для каждого Субконто Из СторнируемыеДвижения.СубконтоДт Цикл Г1роводка.СубконтоДт[Субконто.Ключ] = Субконто.Значение;
КонецЦикла;
Для каждого Субконто Из СторнируемыеДвиження.СубконтоКт Цикл I Іро волка.СубконтоКт[Субконто. Ключ] = Субконто.Значение;
КонецЦикла:
Проводка.ВалютаДт = СторнируемыеДвнжения.ВалкгпіДт;
Проводка. Вал ютаКт = СторнируемыеДвижения.ВалютаКт:
Проводка.ВалютнаяСуммаДт = - СторнируемыеДвижения.ВалютнаяСуммаДт: Проводка.Вал ютнаяСуммаКт = - СторнируемыеДвижения.ВалютнаяСуммаКт; Проводка.КолнчествоДт = - СторнируемыеДвнжения.КоличествоДт; Проводка.КолнчествоКт = - СторнируемыеДвижсния.КолнчествоКт; Проводка. НомерЖурнала = СторнируемыеДвижсния. НомерЖурнала; Проводка.Организация = СторнируемыеДвиження. Организация: Проводка.Содержание = СторнируемыеДвижения.Содержание; Проводка.Сумма = - СторннруемыеДвижения.Сумма;
КонецЦикла;
Движения.Хозрасчетный.Записать();
КонеиПроцедуры
Посредством метода «ВыбратьПоРегистратору» выбираем движения документа «СторнируемыйДокумент» по регистру бухгалтерии «Хозрасчетный».
В цикле перебор этой выборки - формируем новые записи в регистре посредством свойства «Движения» данного документа.
Поле «Период» в них заполняем значением даты нашего документа. Остальные поля записей заполняем содержимым полей сторнируемых движений. Обратите внимание на два цикла перебора субконто дебета и кредита.
Для числовых значений ресурсов при заполнении проставляем знак
«~».
После того, как в цикле будет создан весь набор записей документа -записываем набор записей непосредственно в регистр.
Сложные периодические расчеты
ф Как получить сумму начисления по конкретному видурасчета указанному сотрудникув указанном периоде?
Получим из регистра расчета «БУОсновныеНачисления» результат начисления (ресурс регистра расчета «Результат») некоторому сотруднику («ФизЛицо») по некоторому виду расчета («ВидРасчета») в указанном периоде («Период!»):
Запрос = Новый Запрос;
Заирос.Текст = "ВЫБРАТЬ I БУОсновныеНачисления.Результат |ИЗ
I РегистрРасчета.БУОсновныеНачисления КАК БУОсновныеНачисления |ГДЕ
I БУОсновныеНачнсления.ГІериодРегистрации = &Г1ериод
I И
I БУОсновныеНачисления.ФизЛицо = &ФизЛицо I И
I БУОсновныеНачисления.ВидРасчета - &ВидРасчета";_
Значение параметров запроса берется из соответствующих переменных, существующих в контексте модуля.
Запрос.УстановитьПараметрІ "Период", НачалоМесяца(Период1)); Запрос.УстановитьПараметрС'ВидРасчета", ВидРасчета); Запрос.УстановитьПараметрС'ФизЛицо", ФизЛицо);
(D Как получить сумму всех начислений указанному сотруднику в указанном периоде?
Будем считать, что в конфигурации при решения задач расчета заработной платы для начислений определено два регистра расчета и два плана видов расчета (по основным начислениям и по дополнительным), учет ведется только для одной организации. Необходимо получить данные по всем начислениям сотрудника.
Для решения данной задачи можно использовать текст запроса:
"ВЫБРАТЬ
I БУОсновныеНачисления.Организация КАК Организация,
I ПРЕДСТАВЛЕНИЕ(БУОсновныеНачнслення.Организация),
I БУОсновныеНачисления. ВидРасчета,
I ПРЕДСТАВЛЕНИЕ) БУОсновныеНачисления. ВидРасчета),
I БУОсновныеНачисления.Результат КАК Результат,
I ""’Основные"" КАК ВариантНачислений |ИЗ
I РегистрРасчета.БУОсновныеНачнсления КАК БУОсновныеНачисления |ГДЕ
I БУОсновныеНачисления.ПсриодРегистрации = &НужныйПернод I И БУОсновныеНачисления.ФизЛицо = &ФнзЛнцо
[ОБЪЕДИНИТЬ ВСЕ
ІВЫБРАТЬ
I БУДополнителыіыеНачисления.Органнзация,
I ПРЕДСТАВЛЕН И Е(БУДополнительныеНачисления.Организация),
I БУДополнителыіыеНачисления.ВидРасчета.
I ПРЕДСТАВЛЕНИЕ) БУДополнитсльныеНачисления.ВидРасчета),
I БУДополнительныеНачислення.Результат.
I ""Дополнительные""'
|ИЗ
I РегистрРасчета.БУДополнителыіыеНачисления I КАК БУДополнительныеНачислення |ГДЕ
I БУДополнительныеНачисления.ПсриодРегистрации = &НужныйПсриод
I И
I БУДополнительныеНачисления.ФизЛицо = &ФизЛицо |ИТОГИ СУММА(Результат)
|ПО ОБЩИЕ, Организация. ВариантНачислений";
Нужно не забыть передать значения определенным в тексте запроса параметрам.
Как получить таблицу перерасчетов по перерасчетам нескольких регистров?
По данным перерасчета «ПерерасчетОсновныхНачислений» регистра «ОсновныеНачисленияРаботниковОрганизации» и перерасчета « ПерерасчетД ополнительныхНачисл ений» регистра
«ДополнительныеНачисленияРаботниковОрганизации» необходимо
получить таблицу вида:
Работник |
Вид Расчета |
Документ |
|
|
|
|
|
|
|
|
|
В обоих перерасчетах присутствует измерение «ФизЛицо».
Задачу можно решить посредством объединения запросов по таблицам перерасчетов регистров:
ВЫБРАТЬ
ПерсрасчетОсновных.ФизЛицо КАК Работник, ПсрсрасчетОсновных.ВидРасчета,
ПерерасчстОсновных.Объект Перерасчета КАК Документ ИЗ
РегистрРасчета
.ОсновныеНачисленияРаботниковОрганизации .ПерерасчетОсновныхНачислений КАК ПерерасчетОсновных
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
Перерасчет Дополнительных.ФизЛицо, ПсрерасчетДополнительных.ВидРасчста, ПерерасчетДополннтсльных.ОбъектПерерасчета ИЗ
РегистрРасчета
•ДополнительныеНачисленияРаботниковОріанизаиии .Перерасчет Дополнительных Начислений КАК ПерерасчетДополнительных
Как для документа «НачислениеЗарплатыРаботникам» определить номера строк записей полностью вытесненных видов расчета?
При работе с множественным вытеснением видов расчета может оказаться ситуация что запись документа по регистру расчета содержит полностью вытесненный вид расчета. Например, человек весь месяц проболел -вид расчета «оклад» полностью вытесняется видом расчета «Больничный».
Поиск таких записей можно выполнить посредством следующего запроса:
ВЫБРАТЬ РАЗРЕШЕННЫЕ
УправленческиеНачисления.НомерСтроки КАК НомерСтроки ИЗ
РегистрРасчета.УправленческисНачисления КАК УправленческиеНачисления ЛЕВОЕ СОЕДИНЕНИЕ РегистрРасчета .У правленческиеНачисления
.ФактическийПернолДействня(Регистратор = &парамСсылка)
КАК УправленческиеНачисленияФактичсскийПериодДействия ПО
У правленческиеНачисления.НомерСтроки =
У правленческиеНачнслеиияФактическнйПериодДействия. НомерСтроки И
УправленческиеНачислсния. Регистратор =
У правленческиеНачисленияФактическийІІериодДействия.Регистратор
ГДЕ
УправленческиеНачисления.Регистратор = &парамСсылка И
((У правленчсскисНачислснняФакгическийІІериодДействия. Регистратор)
ЕСТЬ NULL)
В запросе выполняется левое внешнее соединение таблицы регистра «УправленческиеНачисления» и виртуальной таблицы
«УправленческиеНачисления.ФактическийПериодДействия».
В параметрах виртуальной таблицы и в условиях запроса указан отбор по данному документу. Соединение строится по равенству полей «НомерСтроки» и «Регистратор».
В результате соединения могут появиться записи, у которых значение поля «Регистратор» виртуальной таблицы равно NULL. To есть для
данной записи фактический период действия отсутствует. Такие записи и есть предмет нашего поиска.
Каксформировать расчетный листок сотрудника?
Будем считать, что в конфигурации для решения задач расчета заработной платы определены два регистра расчета и два плана видов расчета (соответственно по ачислениям и удержаниям), учет ведется только для одной организации. Необходимо получить данные для расчетного листка сотрудника.
Для решения данной задачи можно использовать следующий текст запроса (его можно определить в конструкторе выходной формы):
"ВЫБРАТЬ
I ВложенныйЗанрос.ФизЛицо.
I П РЕДСТ А ВЛ ЕМ И Е( Вложен н ы й Запрос.Фи зЛ и цо),
I ВложенныйЗамрос.ФизЛицоПредставление КАК ФнзЛицоПредставлениеІ,
I ВложенныйЗапрос.ВидРасчега.
I ПРЕДСТАВЛЕНИЕ(ВложенныйЗапрос.ВидРасчета).
I ВложенныйЗанрос.ВидРасчетаПредставленис КАК ВидРасчетаПредставлениеІ.
I ВложенныйЗапрос. Результат КАК Результат,
I ВложенныйЗапрос.ТипРасчега КАК ТипРасчета |ИЗ
I (ВЫБРАТЬ
I БУОсновныеНачисления.ФизЛицо КАК ФизЛицо,
ПРЕДСТАВЛЕНИЕ(БУОсновныеНачисления.ФизЛицо)
КАК ФизЛицоПредставление,
I БУОсновныеНачисления ВидРасчета КАК ВидРасчета.
ПРЕДСТА ВЛ ЕН И Е(БУОсновныеНачислення. ВидРасчета)
К ЛК ВидРасчетаПредставление,
БУОсновныеНачисления.Результат КАК Результат,
’"'Начисления'"' КАК ТипРасчета I ИЗ
РеіистрРасчсіа. БУОсновныеНачисления КАК БУОсновныеНачисления
I ГДЕ
I БУОсновныеНачисления.ФнзЛицо = &ФизЛицо { И БУОсновныеНачисления.ПериодРепістрацин — &| ІужныйПериол
I ОБЪЕДИНИТЬ ВСЕ
I ВЫБРАТЬ
УдержанняРаботниковОріанизаций.ФизЛицо.
ПРЕДСТАВЛЕН ИЕ(УдержанияРаботниковОрганнзаиий.Фи'зЛицо), УдержанияРаботниковОрганнзаций.ВидРасчета.
ГІРЕДСТАВЛЕНИЕ(УлержанняРабогнііковОріанизаннй.ВидРасчета)._
I -У держанияРабогниковОрганизацнй. Результат.
I '"Удержания""
I ИЗ
I РегистрРасчста.УдержанияРаботннковОрі анизашш КАК УдержанияРаботниковОрганизаций
I ГДЕ
УдержанияРаботниковОрганизаций.ФизЛицо = &ФизЛицо И УдержанияРаботниковОрганизаций. ПернодРепістрации = &НужныйПериод) КАК ВложенныйЗапрос |ИТОГИ
СУММА(Результат)
|ПО
ОБЩИЕ,
I ТішРасчета";
Нужно не забыть передать значения определенным в тексте запроса параметрам и используя возможности работы с табличным документом настроить внешний вид расчетного листка сотрудника.
Как организовать сторнирование уже произведенных расчетов прошлых периодов?
Классическим примером является ввод январского больничного в феврале или т.п.
Допустим, работаем с регистром расчетов «ОсновныеНачисления»:
- 0сисвмыеНачис»іеимяРа6от»*жов0ргаимзашм
ф-JL. Иэмарамя
Еt- ФиэЛицо I. Организация t. Приказ в- f
m Ресурсы }~ I Резул»тат г -1 Отработано Дней г~ I ОтработаноЧасов !—I ОтрабогаиоДнейЛоЛягиаиевке J— I Норме Дней (-— I НормаЧасое *— | НормаДиейЛоПятионееке 0 s Реквизиты
- Графит. Работы - ВиаУчетаВреме*м - Размер
- Допо«**пельныеДатыые - ПойразделемиеОрганиззции - ПериоаРасчетаСреанегоЗаработкаНачало - ПериоаРасчетаСреанегоЗаработкаОгончатме *—» ДагтаНачалаСобыгия
Получить данные тех записей регистра, с которыми конкурируют текущие записи набора записей регистра, выполненные данным регистратором, можно при помощи метода ПолучитьДополнение() менеджера регистра:
ТаблмцаСторноЗаписей = Движения |
|
.Основн ыеі Іач мелен ня Работни .ПолучнтьДополнснисІ); |
овОрганизации |
Для каждого СтрокаСторно Из ТаблмцаСторноЗаписей Цикл |
// Добавить сторно-записи в набор записей регистра.
// Новая запись движений. |
|
Движение = Движения. ОсновнысНачислснияРаботникояОргани зации Добавить!); |
// Заполнить свойства. |
|
Движение. ПериодРегнстрации = Строка. ПериодРсгистрацинСторно:
Движение. ПериодДействия Начало = Строка. ПериодДействия НачалоСторно; Движение.ПериодДействия Конец = Строка. ПериодДеііствияКонсцСторно; |
Движение.БазовыйПсриодНачало = Строка.БазовыйПі |
•риодНачало: |
Движение. БазовыйПериодКонец = Строка. БазовыйГІериодКонец; |
Движение. ВидРасчета = Сгрока.ВидРасчеі
Движение.Сторно = Истина; |
а; |
// Заполнить измерения.
Движение.ФизЛицо = Строка.ФизЛицо;
Движение.ГІриказ = Строка. Приказ;
Движение.Организация = Строка.Организация; |
|
// Ресурсы не заполнять, потому что здесь не происходит // только подготовка новой записи |
расчет. |
// Заполнить реквизиты. |
|
Движенне.ГрафнкРаботы = Строка. ГрафикРаботы: Движение.Размер = Строка.Размер; |
|
Движение. ВидУ четаВремени = Строка. ВидУчетаВремени;
Движение.ПодразделеннсОрганизацин = Строка.ПодразделениеОрганизации: |
Движение. ПериодРасчетаСреднегоЗаработкаНачало = |
|
Сзрока.ПериодРасчетаСреднегоЗаработкаНачало; |
Движение. ІІериодРасчетаСреднегоЗаработкаОкончаниі |
= |
Строка.ПериодРасчетаСрсднегоЗаработкаОкончание; |
КонецЦнкла;
Движения.ОсновныеНачисленияРаботниковОрганизацт |
.Записать!); |
Посредством свойства «Движения» документа обращаемся к набору записей этого документа по регистру расчета «ОсновныеНачисления». Применяем к этому набору записей метод ПолучитьДополнение().
Результатом будет таблица значений, содержащая данные конкурирующих расчетов.
Для того, чтобы записи нашего документа могли записаться несмотря на то, что период действия уже "занят" ранее зарегистрированными записями, выполняем цикл перебора строк полученной таблицы значений, вводя соответствующие им сторно-записи.
В каждой новой записи в поле «ПериодРегистрации» пропишем значение из поля «ПериодРегистрацииСторно» таблицы дополнения. В поле «ПериодДействияНачало» - «ПериодДействияНачалоСторно», в поле «ПериодДействияКонец» - «ПериодДействияКонецСторно». Далее устанавливаем значение Истина для поля «Сторно». Значения для остальных полей новой записи, кроме ресурсов, один в один переносим из полей таблицы «ТаблицаСторноЗаписей».
Ресурсы не заполняем потому, что таблица дополнения содержит не готовые данные для сторно-записи, а лишь данные для расчета сторно-записи (на основании того, что расчет ресурсов еще будет выполняться).
После того, как цикл завершается, выполняем запись новых записей в регистр.
Потом можно приступать к их расчету.
Бизнес-процессы
Как определить бизнес процесс, в котором количество последовательных этапов определяется индивидуально на момент старта экземпляра процесса?
Требуется реализовать следующий процесс:
Каждый день необходимо «объезжать» склады компании. С утра становится известным состав вышедших на работу водителей. Далее менеджеры компании определяет маршрут движения каждого водителя (точек маршрута может быть произвольное количество). Диспетчерская служба отслеживает, на какой точке маршрута находится каждый водитель. После отработки маршрута водитель должен сдать путевой лист с отметками о показаниях спидометра и расходе горючего заранее определенному сотруднику компании. Только после этого процесс считается завершенным.
Для реализации задачи создаем задачу «ЭтапыПути».
Реквизиты адресации:
• Пользователь (Ссылка на справочник «Пользователи»);
• Подразделение.
Считается что в регистре сведений, отвечающем за адресацию соответствующие сведения измерения существуют.
Реквизиты задачи:
• ДатаВыполнения (Время выполнения задачи);
• Исполнитель (Ссылка на справочник пользователей системы);
• Склад (ссылка на справочник складов).
В модуле объекта необходимо разместить процедуру - обработчик
события Перед выполнением:
Процедура ПередВыполиением(Отказ)
Если Исполнитель.ПустаяО Тогда Исполнитель = ПарамстрыСеанса.ТекущийИсполнитсль: КонецЕсли;
ДатаВыполнения=ТекущаяДата();
КонецПроцедуры
Перед выполнением задачи в нее будут записываться информация о пользователе системы выполняющем задачу и дате со временем ее выполнения.
Далее необходимо определить бизнес процесс «НаМаршруте». В свойство «Задачи» выбрать «ЭтапПути». Реквизиты бизнес процесса:
• Водитель (ссылка на соответствующий справочник)
• ПоказанияСпидометраНачальные (Число)
• ПоказанияСпидометраКонечные (Число)
• РасходТоплива (Число)
Карта маршрута бизнес процесса:
Содержание раздела