Базовый курс. Занятие №11
Второе занятие 3-го блока.
Необходимо изучить следующие главы.
Глава 6. Автоматизация количественного учета.
Глава 7. Запросы. Чтение данных из регистра бухгалтерии запросом к базе данных.
Глава 8. Расчет стоимости при выбытии
Также нужно выполнить домашнее задание, текст которого доступен на странице.
Задание необходимо выполнять в ИБ после предыдущего ДЗ.
В этой же теме необходимо написать отчет о выполнении задания.
ps. Участники курса без доступа в мастер-группу отчитываться по домашним заданиям не могут.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
Добрый день, догоняю группу.
Добавил реквизиты УУ и ББ в необходимые документы, выполнил проверку этих флагов на и проведение по значению Истина.
Док. Поступления формирует проводку в конце процедуры ОбработкиПроведения Дт 26 Кт 60 на сумму которая получается процедурой общего модуля. Запрос которой выбирает из текущего документа суммы услуг по видуНоменклатуры.
Получение среднескользящей стоимости реализовал через функцию серверный общий модуль с помощью запроса, который получает две таблицы Количество по рег.Остатков и Стоимость из бух.регистра. В результирующей таблицы вычисляется текущая стоимость посредством деления. Эта величина и является себестоимостью, по сумме которой и формируется проводка Дт 90.02 Кт 41, сумма выручки определяется разницой суммы из документа и себестоимостью и используется для формирования Дт 62 Кт 90.01
Реализован выбор счетов 60 и 62, в документе выписки, посредством создания специальной формы выбора и программной установки отборов приОткрытии. Выписка формирует проводки с корреспонденцией 51 по счетам 60 и 62 в соответствии от выбранных в табличной части, и если приход >0 то Дт 51 Кт 60/62 и если расход >0 Дт 60/62 Кт 51
Заполнение «на основании» документа Выписка производится посредством выборки данных запросом по 60 и 62 счетам. Долг на начало и на конец период получается в этом же запросе. Правда одним запросом получить и таблицу документов со значениями +/- и Нач/Кон ост получить не удалось, поэтому Нач/Кон получаем в обработке результата запроса. Вывод печатной формы сформирован конструктором, а вывод необходимых параметры на начало и на конец доработаны вручную.
http://narod.ru/disk/17371323001/%D0%94%D0%97%20%E2%84%96%2011.dt.html
ДЗ 11
В документы добавила реквизиту «БУ» и «УУ» и организовала проверку при проведние
<code>
если УУ тогда
……………………….
конецЕсли;
если БУ тогда
………………..
конецЕсли;
……………….
если Не отказ тогда
Движения.Взаиморасчеты.Записывать = Истина;
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.Закупки.Записывать = Истина;
Движения.РегистрБухгалтерии.Записывать = Истина;
конецЕсли;
</code>
Списание себестоимости реализовала как в уроках
2. Документ «Выписка» ввод на основание контрагента
<code>
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РегистрБухгалтерииОстатки.Субконто1 как Контрагент,
| РегистрБухгалтерииОстатки.СуммаОстатокКт как расход,
| 0 как Приход
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерии.Остатки(&Момент, Счет = ЗНАЧЕНИЕ(ПланСчетов.БухгалтерскийУчет.Поставщики), ,Субконто1= &Контрагент ) КАК РегистрБухгалтерииОстатки
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РегистрБухгалтерииОстатки.Субконто1 как Контрагент,
| 0 как Расход,
| РегистрБухгалтерииОстатки.СуммаОстатокДт как Приход
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерии.Остатки(&Момент, Счет = ЗНАЧЕНИЕ(ПланСчетов.БухгалтерскийУчет.Покупатели),, Субконто1= &Контрагент) КАК РегистрБухгалтерииОстатки”;
Запрос.УстановитьПараметр(“Контрагент”, ДанныеЗаполнения);
Запрос.УстановитьПараметр(“Момент”, ТекущаяДата());
Результат = Запрос.Выполнить();
Оплаты.Загрузить(результат.Выгрузить());
КонецЕсли;
КонецПроцедуры
</code>
3. «Акт сверки»
Запрос для заполнения данных
<code>
Запрос.Текст =
“ВЫБРАТЬ
| РегистрБухгалтерииДвиженияССубконто.Регистратор КАК документ,
| СУММА(РегистрБухгалтерииДвиженияССубконто.Сумма) КАК приход,
| СУММА(0) КАК расход
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерии.ДвиженияССубконто(&НачДата, &КонДата, СубконтоДт1 = &Контрагент, Период, ) КАК РегистрБухгалтерииДвиженияССубконто
|
|СГРУППИРОВАТЬ ПО
| РегистрБухгалтерииДвиженияССубконто.Регистратор
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РегистрБухгалтерииДвиженияССубконто.Регистратор,
| СУММА(0),
| СУММА(РегистрБухгалтерииДвиженияССубконто.Сумма)
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерии.ДвиженияССубконто(&НачДата, &КонДата, СубконтоКт1 = &Контрагент, Период, ) КАК РегистрБухгалтерииДвиженияССубконто
|
|СГРУППИРОВАТЬ ПО
| РегистрБухгалтерииДвиженияССубконто.Регистратор
|
|УПОРЯДОЧИТЬ ПО
| документ”;
</code>
1/ Добавлены булевские реквизиты упр и бух во все документы. Во всех документах в модуле объекта в процедуре обработка проведения добавлены проверки данных реквизитов, если истина, то выполняются процедуры проведения по упр либо бух учету соответственно. Сложностей с реализацией не было. Заполнение реквизитов по умолчанию и доступность реквизитов различается для разных документов.
2/ Проводки по учету услуг . Сначала пыталась доработать запрос по получению данных табличной части документа и присваивать СчетДт в зависимости от ВидаНоменклатуры (через оператор запроса ВЫБОР) , но при отладке обнаружила что при таком подходе не получается передать значение СубконтоДт одновременно для двух счетов, один из которых не имеет субконтоДт (26 счет). Метод Загрузить выдает ошибку, поэтому передела: проводки по всем позициям, кроме услуг формируются через загрузку результата запроса, проводка по услугам добавляется в набор на общую сумму оказанных услуг. Данный механизм работает для документов ПоступлениеТМЦ и Авансовый отчет (вынесены в общий модуль 2 функции: получения табличной части по виду номенклатуры <> услуга и по виду номенклатуры=услуга)
3/Аналитический учет по контрагентам – сложностей не было, реализовано через доработку существующих запросов заполнением аналитики по счетам взаиморасчетов.
4/ Проверка остатка по бухг учету на счете товары осуществляется в модуле набора записей регистра бухгалтерии (по аналогии с рассмотренным решением в главе 8 бл3) Проводки для документа реализации также сделаны аналогично предложенному в блоке решению. Старалась минимально подглядывать в урок – делала долго, но все получилось.
5/Документ Выписка – проведение документа по регистру Управленческий реализовано не самым эффективным способом – через обход строк табличной части циклом и формирование соответствующих проводок в зависимости от заполнения суммы прихода либо суммы расхода. Пробовала реализовать через запрос – не получилось корректно объединить и загрузить результаты двух запросов в один набор движений по регистру бухгалтерии, буду искать ответ в предложенном решении
6/ Ввод выписки на основании контрагента – сделано, сложностей не было. Реализовано через запрос к вирт.таблице Остатки регистра бухгалтерии, с наложением параметров по счетам и условием по значению субконто контрагенты
7/Создан документ АктСверкиВзаиморасчетов. Табличная часть заполняется через запрос к регистру накопления Взаиморасчеты Обороты+к регистру Остатков на дату Начала и Окончания. Сложности были с заполнением табл.части – не могла передать табл.значения из запроса в табл часть формы. Все получилось после исправления директивы компиляции на &НаСервере (изначально пыталась делать с видом НаСервереБезКонтектста)
1) В документах добавил булевый реквизит УУ, БУ(флаги проведения). И в документах добавил булевый реквизит ПроведенвУУ и ПроведенвБУ (текущие значения проведения документа в УУ и БУ)
<code>
Процедура ОбработкаПроведения(Отказ, Режим)
Если УУ ИЛИ БУ Тогда
//обеспечиваю отмену проведения
// регистр ОстаткиТоваров Приход
Движения.ОстаткиТоваров.Записывать = Истина;
// регистр ЗакупкиОтПоставщиков
Движения.ЗакупкиОтПоставщиков.Записывать = Истина;
// регистр Взаиморасчеты Приход
Движения.Взаиморасчеты.Записывать = Истина;
//РегистрБухгалтерии
Движения.РегистрБухгалтерии.Записывать = Истина;
Для Каждого ТекСтрокаСтроки Из Строки Цикл
Если УУ Тогда
ОбработкапроведенияУУ(ТекСтрокаСтроки);
КонецЕсли;
Если БУ Тогда
ОбработкапроведенияБУ(ТекСтрокаСтроки);
КонецЕсли;
КонецЦикла;
Иначе
Отказ = Истина;
Сообщить(“Проведение не возможно. Проведение должно быть хоть в одном УУ или БУ”);
КонецЕсли;
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
СуммаДокумента = Строки.Итог(“Сумма”);
Если РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения или РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
ПроведенвУУ = Ложь;
ПроведенвБУ = ложь;
Если УУ И РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
ПроведенвУУ = Истина;
КонецЕсли;
Если БУ И РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
ПроведенвБУ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code> 2) Проведение документов в БУ сделал как в уроках. Для ведения аналитического учета в РН «Взаиморасчеты» есть измерение «Контрагент», и в проведении в УУ это учитываю. 3) В план счетов «Бухгалтерский» добавил признак учета «Количественный» и указал его в плане счетов у счетов Товары и Материалы. В регистр бухгалтерии добавил ресурс Сумма и далее все по урокам для документов «ДокПоступления», «ДокРеализации», «Операция». В проведении по БУ в ДокРеализации все как в уроке, за исключением одной строки в запросе –
<code>
СУММА(ДокРеализацииСтроки.КоэфПересчета * ДокРеализацииСтроки.Колво) КАК КолДок
</code>
4)В документ «Выписка» добавил реквизиты — информацию по счетам и сделал авто-заполнение без возможности редактирования
<code>
&НаКлиенте
Процедура СтрокиПриходПриИзменении(Элемент)
ТД = Элементы.Строки.ТекущиеДанные;
УстановитьСчета(ТД.ПСчетДт, ТД.ПСчетКт, ТД.Приход, “Приход”);
КонецПроцедуры
&НаКлиенте
Процедура СтрокиРасходПриИзменении(Элемент)
ТД = Элементы.Строки.ТекущиеДанные;
УстановитьСчета(ТД.РСчетДт, ТД.РСчетКт, ТД.Расход, “Расход”);
КонецПроцедуры
&НаСервереБезКонтекста
Процедура УстановитьСчета(СчетДт, СчетКт, Движ, ВиДвиж)
Если Движ=0 и (ЗначениеЗаполнено(СчетДт) ИЛИ ЗначениеЗаполнено(СчетКт)) Тогда
СчетДт = ПланыСчетов.Бухгалтерский.ПустаяСсылка();
СчетКт = ПланыСчетов.Бухгалтерский.ПустаяСсылка();
КонецЕсли;
Если Движ<>0 и (НЕ ЗначениеЗаполнено(СчетДт) ИЛИ НЕ ЗначениеЗаполнено(СчетКт)) Тогда
Если ВиДвиж = “Приход” Тогда
СчетДт = ПланыСчетов.Бухгалтерский.Банк;
СчетКт = ПланыСчетов.Бухгалтерский.Покупатели;
Иначе
СчетДт = ПланыСчетов.Бухгалтерский.Поставщики;
СчетКт = ПланыСчетов.Бухгалтерский.Банк;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code> В МО документа «Выписка» добавил проведение
<code>
Процедура ОбработкаПроведения(Отказ, Режим)
Если УУ ИЛИ БУ Тогда
// регистр Взаиморасчеты Приход
Движения.Взаиморасчеты.Записывать = Истина;
//РегистрБухгалтерии
Движения.РегистрБухгалтерии.Записывать = Истина;
Для Каждого ТекСтрокаСтроки Из Строки Цикл
Если УУ Тогда
ОбработкапроведенияУУ(ТекСтрокаСтроки);
КонецЕсли;
Если БУ Тогда
ОбработкапроведенияБУ(ТекСтрокаСтроки);
КонецЕсли;
КонецЦикла;
Иначе
Отказ = Истина;
Сообщить(“Проведение не возможно. Проведение должно быть хоть в одном УУ или БУ”);
КонецЕсли;
КонецПроцедуры
Процедура ОбработкапроведенияУУ(ТекСтрокаСтроки)
Если ЗначениеЗаполнено(ТекСтрокаСтроки.Приход) Тогда
Движение = Движения.Взаиморасчеты.ДобавитьПриход();
Движение.Период = Дата;
Движение.Контрагент = ТекСтрокаСтроки.Контрагент;
Движение.Сумма = ТекСтрокаСтроки.Приход;
КонецЕсли;
Если ЗначениеЗаполнено(ТекСтрокаСтроки.Расход) Тогда
Движение = Движения.Взаиморасчеты.ДобавитьРасход();
Движение.Период = Дата;
Движение.Контрагент = ТекСтрокаСтроки.Контрагент;
Движение.Сумма = ТекСтрокаСтроки.Расход;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкапроведенияБУ(ТекСтрокаСтроки)
Если ЗначениеЗаполнено(ТекСтрокаСтроки.Приход) Тогда
Проводка = Движения.РегистрБухгалтерии.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ТекСтрокаСтроки.ПСчетДт;
Проводка.СчетКт = ТекСтрокаСтроки.ПСчетКт;
Проводка.СубконтоКт.Контрагенты = ТекСтрокаСтроки.Контрагент;
Проводка.Сумма = ТекСтрокаСтроки.Приход;
КонецЕсли;
Если ЗначениеЗаполнено(ТекСтрокаСтроки.Расход) Тогда
Проводка = Движения.РегистрБухгалтерии.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ТекСтрокаСтроки.РСчетДт;
Проводка.СубконтоДт.Контрагенты = ТекСтрокаСтроки.Контрагент;
Проводка.СчетКт = ТекСтрокаСтроки.РСчетКт;
Проводка.Сумма = ТекСтрокаСтроки.Расход;
КонецЕсли;
КонецПроцедуры
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если РежимЗаписи = РежимЗаписиДокумента.ОтменаПроведения или РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
ПроведенвУУ = Ложь;
ПроведенвБУ = ложь;
Если УУ И РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
ПроведенвУУ = Истина;
КонецЕсли;
Если БУ И РежимЗаписи = РежимЗаписиДокумента.Проведение Тогда
ПроведенвБУ = Истина;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code> В МО «Выписка» добавил заполнение на основании <code>
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
УУ = Истина;
БУ = Истина;
ПроведенвУУ = Ложь;
ПроведенвБУ = Ложь;
Основание = ДанныеЗаполнения;
Дата = наСервере_ВремяНаСервере.ПолучитьВремяНаСервере();
Контрагент = ДанныеЗаполнения.Ссылка;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| &Контрагент КАК Контрагент,
| ВЫБОР
| КОГДА Приход.СуммаОстатокДт ЕСТЬ NULL
| ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.ПустаяСсылка)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.Банк)
| КОНЕЦ КАК ПСчетДт,
| Приход.Счет КАК ПСчетКт,
| ЕСТЬNULL(Приход.СуммаОстатокДт, 0) КАК Приход,
| Расход.Счет КАК РСчетДт,
| ВЫБОР
| КОГДА Расход.СуммаОстатокКт ЕСТЬ NULL
| ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.ПустаяСсылка)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.Банк)
| КОНЕЦ КАК РСчетКт,
| ЕСТЬNULL(Расход.СуммаОстатокКт, 0) КАК Расход
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерии.Остатки(&Моментвремени, Счет = ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.Покупатели), , Субконто1 = &Контрагент) КАК Приход
| ПОЛНОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.РегистрБухгалтерии.Остатки(&МоментВремени, Счет = ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.Поставщики), , Субконто1 = &Контрагент) КАК Расход
| ПО Приход.Субконто1 = Расход.Субконто1”;
Запрос.УстановитьПараметр(“Моментвремени”, Дата);
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
ТЧстроки = Результат.Выгрузить();
Строки.Загрузить(ТЧстроки);
Иначе
Сообщить(“По этому Контрагенту нет долгов”);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code> 5) В отчете «АктСверкиВзаиморасчетов» набор данных –
<code>
ВЫБРАТЬ
ВсеДокРН.Регистратор,
СУММА(СуммаДт.Сумма) КАК СуммаДт,
СУММА(СуммаКт.Сумма) КАК СуммаКт
ИЗ
(ВЫБРАТЬ РАЗЛИЧНЫЕ
РегистрБухгалтерииДвиженияССубконто.Регистратор КАК Регистратор
ИЗ
РегистрБухгалтерии.РегистрБухгалтерии.ДвиженияССубконто КАК РегистрБухгалтерииДвиженияССубконто
ГДЕ
РегистрБухгалтерииДвиженияССубконто.Период >= &НачалоПериода
И РегистрБухгалтерииДвиженияССубконто.Период <= &КонецПериода
И РегистрБухгалтерииДвиженияССубконто.Активность = &Активность
И ((РегистрБухгалтерииДвиженияССубконто.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.Поставщики)
ИЛИ РегистрБухгалтерииДвиженияССубконто.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.Покупатели))
И РегистрБухгалтерииДвиженияССубконто.СубконтоДт1 = &Контрагент
ИЛИ (РегистрБухгалтерииДвиженияССубконто.СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.Поставщики)
ИЛИ РегистрБухгалтерииДвиженияССубконто.СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.Покупатели))
И РегистрБухгалтерииДвиженияССубконто.СубконтоКт1 = &Контрагент)) КАК ВсеДокРН
ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
РегистрБухгалтерииДвиженияССубконто.Регистратор КАК Регистратор,
РегистрБухгалтерииДвиженияССубконто.Сумма КАК Сумма
ИЗ
РегистрБухгалтерии.РегистрБухгалтерии.ДвиженияССубконто КАК РегистрБухгалтерииДвиженияССубконто
ГДЕ
РегистрБухгалтерииДвиженияССубконто.Период >= &НачалоПериода
И РегистрБухгалтерииДвиженияССубконто.Период <= &КонецПериода
И (РегистрБухгалтерииДвиженияССубконто.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.Поставщики)
ИЛИ РегистрБухгалтерииДвиженияССубконто.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.Покупатели))
И РегистрБухгалтерииДвиженияССубконто.СубконтоДт1 = &Контрагент
И РегистрБухгалтерииДвиженияССубконто.Активность = &Активность) КАК СуммаДт
ПО ВсеДокРН.Регистратор = СуммаДт.Регистратор
ПОЛНОЕ СОЕДИНЕНИЕ (ВЫБРАТЬ
РегистрБухгалтерииДвиженияССубконто.Регистратор КАК Регистратор,
РегистрБухгалтерииДвиженияССубконто.Сумма КАК Сумма
ИЗ
РегистрБухгалтерии.РегистрБухгалтерии.ДвиженияССубконто КАК РегистрБухгалтерииДвиженияССубконто
ГДЕ
РегистрБухгалтерииДвиженияССубконто.Период >= &НачалоПериода
И РегистрБухгалтерииДвиженияССубконто.Период <= &КонецПериода
И РегистрБухгалтерииДвиженияССубконто.Активность = &Активность
И (РегистрБухгалтерииДвиженияССубконто.СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.Поставщики)
ИЛИ РегистрБухгалтерииДвиженияССубконто.СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.Покупатели))
И РегистрБухгалтерииДвиженияССубконто.СубконтоКт1 = &Контрагент) КАК СуммаКт
ПО ВсеДокРН.Регистратор = СуммаКт.Регистратор
СГРУППИРОВАТЬ ПО
ВсеДокРН.Регистратор
</code>
…. так нужен был не отчет. Ок. Запрос уже есть, делаю документ «АктСверкиВзаиморасчетов»(реквизиты – НачалоПериода, КонецПериода, Контрагент, СуммаОстНач, СуммаОстКон и ТЧ — Регистратор, СуммаДт, СуммаКТ), без проведения. В форме документа ТЧ делаю только просмотр. Результат запроса загружаю в ТЧ. Печатная форма конструкторои сделана и чуть подправлена.
Задание выполнено.
1. Проведение поступления
Процедура СформироватьДвиженияБУ(Запрос)
Запрос.Текст =
“ВЫБРАТЬ
| втТовары.Период,
| ВЫБОР
| КОГДА втТовары.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНомерклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Затраты)
| КОНЕЦ КАК СчетДт,
| ВЫБОР
| КОГДА втТовары.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНомерклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Номенклатура)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| КОНЕЦ КАК ВидСубконтоДт1,
| ВЫБОР
| КОГДА втТовары.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНомерклатуры.Услуга)
| ТОГДА втТовары.Номенклатура
| ИНАЧЕ НЕОПРЕДЕЛЕНО
| КОНЕЦ КАК СубконтоДт1,
| ВЫБОР
| КОГДА втТовары.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНомерклатуры.Услуга)
| ТОГДА втТовары.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК КоличествоДт,
| ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Поставщики) КАК СчетКт,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты) КАК ВидСубконтоКт1,
| втТовары.Контрагент КАК СубконтоКт1,
| втТовары.Стоимость КАК Сумма
|ИЗ
| втТовары КАК втТовары”;
Движения.Управленческий.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, Режим)
МетаданныеДвижения = ЭтотОбъект.Метаданные().Движения;
Для каждого Строка Из МетаданныеДвижения Цикл
Движения[Строка.Имя].Записывать = Истина;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Период”, Дата);
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Запрос.Текст =
“ВЫБРАТЬ
| &Период КАК Период,
| &Контрагент КАК Контрагент,
| ПоступлениеТоваровТовары.Номенклатура,
| ПоступлениеТоваровТовары.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
| ПоступлениеТоваровТовары.Качество,
| СУММА(ПоступлениеТоваровТовары.Количество * ПоступлениеТоваровТовары.Коэффициент) КАК Количество,
| СУММА(ПоступлениеТоваровТовары.Сумма) КАК Стоимость
|ПОМЕСТИТЬ втТовары
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
|ГДЕ
| ПоступлениеТоваровТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПоступлениеТоваровТовары.Качество,
| ПоступлениеТоваровТовары.Номенклатура,
| ПоступлениеТоваровТовары.Номенклатура.ВидНоменклатуры”;
Запрос.Выполнить();
Если УУ Тогда
СформироватьДвиженияУУ(Запрос);
КонецЕсли;
Если БУ Тогда
СформироватьДвиженияБУ(Запрос);
КонецЕсли;
КонецПроцедуры
2. Проведение реализации
Процедура СформироватьДвиженияБУ()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.Коэффициент) КАК Количество
|ПОМЕСТИТЬ втТовары
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНомерклатуры.Услуга)
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втТовары.Номенклатура,
| втТовары.Количество,
| ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ЕСТЬNULL(Остатки.СуммаОстаток, 0) КАК СуммаОстаток
|ИЗ
| втТовары КАК втТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки(
| &Момент,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары),
| ,
| Субконто1 В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| втТовары.Номенклатура
| ИЗ
| втТовары КАК втТовары)) КАК Остатки
| ПО втТовары.Номенклатура = Остатки.Субконто1”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Момент”, МоментВремени());
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Нехватка = Выборка.Количество – Макс(Выборка.КоличествоОстаток,-Выборка.КоличествоОстаток);
Если Нехватка > 0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “При списании “+Выборка.Номенклатура+” превышен остаток на “+Нехватка+” ед.”;
Сообщение.Сообщить();
КонецЕсли;
Движение = Движения.Управленческий.Добавить();
Движение.Период = Дата;
Движение.СчетДт = ПланыСчетов.Управленческий.Себестоимость;
Движение.СчетКт = ПланыСчетов.Управленческий.Товары;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура;
Движение.КоличествоКт = Выборка.Количество;
Если Нехватка = 0 ИЛИ Выборка.КоличествоОстаток = 0 Тогда
Движение.Сумма = Выборка.СуммаОстаток;
Иначе
Движение.Сумма = Выборка.Количество * Выборка.СуммаОстаток / Выборка.КоличествоОстаток;
КонецЕсли;
КонецЦикла;
Движение = Движения.Управленческий.Добавить();
Движение.Период = Дата;
Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
Движение.СчетКт = ПланыСчетов.Управленческий.Выручка;
Движение.Сумма = СуммаДокумента;
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
МетаданныеДвижения = ЭтотОбъект.Метаданные().Движения;
Для каждого Строка Из МетаданныеДвижения Цикл
Движения[Строка.Имя].Записывать = Истина;
КонецЦикла;
Если УУ Тогда
СформироватьДвиженияУУ(Отказ);
КонецЕсли;
Если БУ И НЕ Отказ Тогда
СформироватьДвиженияБУ();
КонецЕсли;
КонецПроцедуры
3. Проведение выписки
Процедура СформироватьДвиженияБУ()
Для каждого Строка Из СтрокиВыписки Цикл
Если Строка.Приход > 0 Тогда
Движение = Движения.Управленческий.Добавить();
Движение.Период = Дата;
Движение.СчетДт = ПланыСчетов.Управленческий.Банк;
Движение.СчетКт = Строка.СчетРасчетов;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Строка.Контрагент;
Движение.Сумма = Строка.Приход;
КонецЕсли;
Если Строка.Расход > 0 Тогда
Движение = Движения.Управленческий.Добавить();
Движение.Период = Дата;
Движение.СчетДт = Строка.СчетРасчетов;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Строка.Контрагент;
Движение.СчетКт = ПланыСчетов.Управленческий.Банк;
Движение.Сумма = Строка.Расход;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
МетаданныеДвижения = ЭтотОбъект.Метаданные().Движения;
Для каждого Строка Из МетаданныеДвижения Цикл
Движения[Строка.Имя].Записывать = Истина;
КонецЦикла;
Если УУ Тогда
СформироватьДвиженияУУ();
КонецЕсли;
Если БУ И НЕ Отказ Тогда
СформироватьДвиженияБУ();
КонецЕсли;
КонецПроцедуры
4. Ввод на основании
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| УправленческийОстатки.Субконто1 КАК Контрагент,
| УправленческийОстатки.Счет КАК СчетРасчетов,
| ВЫБОР
| КОГДА УправленческийОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели)
| ТОГДА УправленческийОстатки.СуммаОстатокДт
| ИНАЧЕ 0
| КОНЕЦ КАК Приход,
| ВЫБОР
| КОГДА УправленческийОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Поставщики)
| ТОГДА УправленческийОстатки.СуммаОстатокКт
| ИНАЧЕ 0
| КОНЕЦ КАК Расход
|ИЗ
| РегистрБухгалтерии.Управленческий.Остатки(, Счет В (ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Поставщики), ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели)), , Субконто1 = &Контрагент) КАК УправленческийОстатки”;
Запрос.УстановитьПараметр(“Контрагент”, ДанныеЗаполнения);
СтрокиВыписки.Загрузить(Запрос.Выполнить().Выгрузить());
КонецЕсли;
КонецПроцедуры
5. Заполнение акта сверки
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
Модифицированность = Истина;
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| СУММА(УправленческийОстатки.СуммаОстаток) КАК СуммаОстаток
|ИЗ
| РегистрБухгалтерии.Управленческий.Остатки(&ДатаНачала, Счет В (ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Поставщики), ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели)), , Субконто1 = &Контрагент) КАК УправленческийОстатки
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| УправленческийОбороты.Регистратор КАК ДокументДвижения,
| УправленческийОбороты.СуммаОборотДт КАК УвеличениеДолга,
| УправленческийОбороты.СуммаОборотКт КАК УменьшениеДолга
|ИЗ
| РегистрБухгалтерии.Управленческий.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, Счет В (ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Поставщики), ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели)), , Субконто1 = &Контрагент, , ) КАК УправленческийОбороты
|АВТОУПОРЯДОЧИВАНИЕ”;
Запрос.УстановитьПараметр(“ДатаНачала”, Объект.ДатаНачала);
Запрос.УстановитьПараметр(“ДатаОкончания”, КонецДня(Объект.ДатаОкончания));
Запрос.УстановитьПараметр(“Контрагент”, Объект.Контрагент);
Результат = Запрос.ВыполнитьПакет();
ВыборкаОстаток = Результат[0].Выбрать();
ВыборкаОстаток.Следующий();
Объект.ОстатокНаНачало = ВыборкаОстаток.СуммаОстаток;
Объект.Документы.Загрузить(Результат[1].Выгрузить());
Объект.ОстатокНаКонец = Объект.ОстатокНаНачало + Объект.Документы.Итог(“УвеличениеДолга”) – Объект.Документы.Итог(“УменьшениеДолга”);
КонецПроцедуры // ()
6. Печать акта сверки
Печать выполнена через конструктор
Страшно отстаю от курсов, но все же вперед двигаюсь. Завтра сделаю 12е ДЗ.
1. В документы, которые формируют движения, добавил реквизиты “УУ” и “БУ”. В модулях проведения сбор данных по табличным частям и Движения.ИмяРегистра.Записывать = Истина, вынес за условие. В условия “Если УУ Тогда” и “Если БУ Тогда” завернул алгоритмы формирования движений.
2. Проводка 26-60 и аналитический учет по поставщикам и покупателям реализован добавлением вида субконто “Контрагенты” для счетов 60 и 62. Переделан запрос, собирающий данные из табличных частей поступления и авансового отчета для движений по регистру бухгалтерии:
[code]
“ВЫБРАТЬ
| ВЫБОР
| КОГДА НоменклатураСправочник.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(ПланСчетов.ПланСчетов.Затраты)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланСчетов.ПланСчетов.Товары)
| КОНЕЦ КАК СчетДт,
| ВЫБОР
| КОГДА НоменклатураСправочник.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Номенклатура)
| КОНЕЦ КАК ВидСубконтоДт1,
| ДокументТЧ.Номенклатура КАК СубконтоДт1,
| &СчетКт,
| ВЫБОР
| КОГДА &СчетКт = ЗНАЧЕНИЕ(ПланСчетов.ПланСчетов.Поставщики)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| КОНЕЦ КАК ВидСубконтоКт1,
| &Контрагент КАК СубконтоКт1,
| СУММА(ДокументТЧ.Сумма) КАК Сумма,
| &Период,
| НоменклатураСправочник.ВидНоменклатуры
|ИЗ
| &Документ КАК ДокументТЧ
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Номенклатура КАК НоменклатураСправочник
| ПО ДокументТЧ.Номенклатура = НоменклатураСправочник.Ссылка
|ГДЕ
| ДокументТЧ.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ДокументТЧ.Номенклатура,
| НоменклатураСправочник.ВидНоменклатуры”;
[/code]
3. Себестоимость при реализации рассчитыватся точно так как описано в уроках, никаких сложностей. В задании не указано явно, что на 41м счете нужно вести количественный учет, поэтому я брал остатки по количеству из регистра накопления левым соединением.
4. При создании выписки на основании контрагента выполняется запрос к остаткам регистра бухгалтерии с отбором по счетам 60 и 62 и контрагенту, затем в цикле формируются строки табличной части – если остаток по дебету не равен нулю (долг нам), то это приход, если остаток по кредиту не равен нулю (мы должны), то это расход.
5. Для заполнения табличной части документа “Акт сверки взаиморасчетов” использовался запрос по таблице регистра бухгалтерии “ДвиженияССубконто”
[code]
“ВЫБРАТЬ
| РегистрБУДвиженияССубконто.Регистратор КАК Регистратор,
| РегистрБУДвиженияССубконто.СчетДт,
| РегистрБУДвиженияССубконто.СчетКт,
| СУММА(РегистрБУДвиженияССубконто.Сумма) КАК Сумма
|ИЗ
| РегистрБухгалтерии.РегистрБУ.ДвиженияССубконто(
| &ДатаНачала,
| &ДатаОкончания,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.ПланСчетов.Поставщики)
| И Субконто1 = &Контрагент
| ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.ПланСчетов.Покупатели)
| И Субконто1 = &Контрагент,
| ,
| ) КАК РегистрБУДвиженияССубконто
|
|СГРУППИРОВАТЬ ПО
| РегистрБУДвиженияССубконто.Регистратор,
| РегистрБУДвиженияССубконто.СчетДт,
| РегистрБУДвиженияССубконто.СчетКт
|
|УПОРЯДОЧИТЬ ПО
| Регистратор
|АВТОУПОРЯДОЧИВАНИЕ”;
[/code]
6. Для получения остатков по взаиморасчетам для печатной формы используется запрос к таблице регистра бухгалтерии “ОстаткиИОбороты”
[code]
“ВЫБРАТЬ
| СУММА(РегистрБУОстаткиИОбороты.СуммаНачальныйОстаток) КАК СуммаНачальныйОстаток,
| СУММА(РегистрБУОстаткиИОбороты.СуммаКонечныйОстаток) КАК СуммаКонечныйОстаток
|ИЗ
| РегистрБухгалтерии.РегистрБУ.ОстаткиИОбороты(
| &ДатаНачала,
| &ДатаОкончания,
| ,
| ,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.ПланСчетов.Поставщики)
| ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.ПланСчетов.Покупатели),
| ,
| Субконто1 = &Контрагент) КАК РегистрБУОстаткиИОбороты”;
[/code]
Задание выполнил.
Настроил аналитический учет в разрезе контрагентов по счетам 60 и 62. Для учета услуг в документах “Поступление товаров”, в запрос получения данных по ТМЦ документа добавил объединение получения услуг.
В документе реализации добавил контроль остатков и выполнение движений по по регистру бухгалтерии
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ДвиженияОперативногоУчета(Отказ, РежимПроведения);
Движения.РегистрБухгалтерииХозрасчетный.Очистить();
Движения.РегистрБухгалтерииХозрасчетный.Записать();
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Количество КАК КолДок,
| Товары.Сумма КАК СумДок,
| Товары.НомерСтроки,
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстатокДт, 0) КАК СумОст,
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.КоличествоОстатокДт, 0) КАК КолОст
|ИЗ
| (ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество) КАК Количество,
| СУММА(РеализацияТоваровТовары.Сумма) КАК Сумма,
| МАКСИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура) КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(
| &Момент,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары),
| ,
| Субконто1 В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТовары.Номенклатура
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка)) КАК РегистрБухгалтерииХозрасчетныйОстатки
| ПО Товары.Номенклатура = РегистрБухгалтерииХозрасчетныйОстатки.Субконто1”;
Запрос.УстановитьПараметр(“Момент”, МоментВремени());
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Нехватка = Выборка.КолДок – Выборка.КолОст;
Если Нехватка > 0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Товара “+Выборка.Номенклатура+” недостаточно в количестве “+Нехватка;
Сообщение.Поле = “Товары[“+(Выборка.НомерСтроки-1)+”].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Себестоимость;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.Товары;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Товары] = Выборка.Номенклатура;
Проводка.КоличествоКт = Выборка.КолДок;
Если Выборка.КолОСт <> 0 Тогда
Проводка.Сумма = Выборка.СумОст*Выборка.КолДок/Выборка.КолОст;
Иначе
Проводка.Сумма = 0;
КонецЕсли;
КонецЦикла;
Если НЕ Отказ Тогда
Движения.РегистрБухгалтерииХозрасчетный.Записывать = Истина;
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Покупатели;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.Выручка;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
Проводка.Сумма = Товары.Итог(“Сумма”);
КонецЕсли;
КонецПроцедуры
</code>
В документе “Выписка” реализовал ввод на основании и нужные проводки
<code>
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РегистрБухгалтерииХозрасчетныйОстатки.Счет КАК СчетРасчетов,
| РегистрБухгалтерииХозрасчетныйОстатки.Субконто1 КАК Контрагент,
| РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстатокДт КАК Приход,
| РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстатокКт КАК Расход
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(, , &Субконто, Субконто1 = &Контрагент) КАК РегистрБухгалтерииХозрасчетныйОстатки”;
Запрос.УстановитьПараметр(“Субконто”, ПланыВидовХарактеристик.ВидыСубконто.Контрагенты);
Запрос.УстановитьПараметр(“Контрагент”, ДанныеЗаполнения);
Результат = Запрос.Выполнить();
Оплаты.Загрузить(Результат.Выгрузить());
КонецЕсли;
КонецПроцедуры
</code>
Для акта сверки взял данные из виртуальной таблицы “ОстаткиИОбороты”
<code>
&НаКлиенте
Процедура Сформировать(Команда)
СформироватьНаСервере(Объект.Контрагент, Объект.ДатаНачала, Объект.ДатаОкончания);
КонецПроцедуры
&НаСервере
Процедура СформироватьНаСервере(Контрагент, ДатаНачала, ДатаОкончания)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| СУММА(РегистрБухгалтерииХозрасчетныйОстаткиИОбороты.СуммаНачальныйОстаток) КАК СуммаНачальныйОстаток,
| СУММА(РегистрБухгалтерииХозрасчетныйОстаткиИОбороты.СуммаКонечныйОстаток) КАК СуммаКонечныйОстаток,
| РегистрБухгалтерииХозрасчетныйОстаткиИОбороты.Регистратор КАК Документ,
| РегистрБухгалтерииХозрасчетныйОстаткиИОбороты.Регистратор.Дата КАК ДатаДок,
| СУММА(РегистрБухгалтерииХозрасчетныйОстаткиИОбороты.СуммаОборотДт) КАК УвеличениеДолга,
| СУММА(РегистрБухгалтерииХозрасчетныйОстаткиИОбороты.СуммаОборотКт) КАК УменьшениеДолга
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.ОстаткиИОбороты(&ДатаНачала, &ДатаОкончания, Регистратор, , , , Субконто1 = &Контрагент) КАК РегистрБухгалтерииХозрасчетныйОстаткиИОбороты
|
|СГРУППИРОВАТЬ ПО
| РегистрБухгалтерииХозрасчетныйОстаткиИОбороты.Регистратор,
| РегистрБухгалтерииХозрасчетныйОстаткиИОбороты.Регистратор.Дата”;
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Запрос.УстановитьПараметр(“ДатаНачала”, ДатаНачала);
Запрос.УстановитьПараметр(“ДатаОкончания”, ДатаОкончания);
Результат = Запрос.Выполнить().Выгрузить();
Результат.Сортировать(“ДатаДок”);
Объект.Взаиморасчеты.Загрузить(Результат);
КонецПроцедуры
</code>
Задание выполнено. В документы добавлены признаки учета (БУ, УУ) и измененены процедуры проведения. Создан новый документ АктСверки.
http://imagepost.ru/images/d/z1/dz11_screen.png
Долго делал раздел бух. учета… И так:
Флаги УУ или БУ в обработке проведения поставил условие:
Если УУ Тогда
//Тут Движение по регистрам накопления
Иначе
ОбработкаДокументов.ОчиститьУУ(Движения);
ОбработкаДокументов.ОчиститьУУ(Движения);
КонецЕсли;
<code>Процедура ОчиститьУУ(Движения) Экспорт
Для каждого СтрокаДвижения Из Движения Цикл
МетаданныеРегНак = СтрокаДвижения.Метаданные();
Если Метаданные.РегистрыНакопления.Содержит(МетаданныеРегНак) Тогда
СтрокаДвижения.Записать();
КонецЕсли
КонецЦикла;
КонецПроцедуры
</code>
Добавил аналитику по 60 и 62 счетам, в документе “Поступление товаров” реализовал услуги:
<code>Процедура ВыполнитьДвиженияУслуг(Ссылка) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Услуги.Ссылка.Дата КАК Период,
| ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Затраты) КАК СчетДТ,
| ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Поставщики) КАК СчетКТ,
| СУММА(Услуги.Сумма) КАК Сумма,
| Услуги.Ссылка.Контрагент КАК СубконтоКТ1,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагент) КАК ВидСубконтоКТ1
|ИЗ
| Документ.ПоступлениеТоваров.Услуги КАК Услуги
|ГДЕ
| Услуги.Ссылка = &Ссылка
| И Услуги.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидНоменклатуры.Услуга)
|
|СГРУППИРОВАТЬ ПО
| Услуги.Ссылка.Дата,
| Услуги.Ссылка.Контрагент”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
НаборБУ = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
НаборБУ.Записывать = Истина;
НаборБУ.Отбор.Регистратор.Значение = Ссылка;
НаборБУ.Прочитать();
ТаблицаТовара = НаборБУ.Выгрузить();
Для каждого Строка Из Результат.Выгрузить() Цикл
НоваяСтрока = ТаблицаТовара.Добавить();
НоваяСтрока.Активность = Истина;
НоваяСтрока.Период = Строка.Период;
НоваяСтрока.СчетДТ = Строка.СчетДТ;
НоваяСтрока.СчетКТ = Строка.СчетКТ;
НоваяСтрока.Сумма = Строка.Сумма;
НоваяСтрока.ВидСубконтоКТ1 = Строка.ВидСубконтоКТ1;
НоваяСтрока.СубконтоКТ1 = Строка.СубконтоКТ1;
КонецЦикла;
НаборБУ.Загрузить(ТаблицаТовара);
НаборБУ.Записать();
КонецПроцедуры
</code>
Движение по документу “Реализация Товаров” реализовал в процедуре общего модуля:
<code>
Процедура ВыполнитьДвиженияРеализация(Движения, Отказ) Экспорт
Отбор = Движения.Отбор;
Ссылка = Отбор.Регистратор.Значение;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество) КАК Количество,
| СУММА(РеализацияТоваровТовары.Сумма) КАК Сумма,
| МАКСИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки
|ПОМЕСТИТЬ ВТ_Товары
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ВТ_Товары.Номенклатура,
| ВТ_Товары.Количество,
| ВТ_Товары.Сумма,
| ВТ_Товары.НомерСтроки,
| ЕСТЬNULL(ХозрасчетныйОстатки.СуммаОстатокДт, 0) КАК СуммаОстаток,
| ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстатокДт, 0) КАК КоличествоОстаток
|ИЗ
| ВТ_Товары КАК ВТ_Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Остатки(
| &МоментВремени,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары),
| ,
| Субконто1 В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТовары.Номенклатура
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка)) КАК ХозрасчетныйОстатки
| ПО ВТ_Товары.Номенклатура = ХозрасчетныйОстатки.Субконто1”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“МоментВремени”, Ссылка.МоментВремени());
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Разница = Выборка.Количество – Выборка.КоличествоОстаток;
Если Разница>0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Нехватрка товара “+Выборка.Номенклатура+” в количестве: “+Разница;
Сообщение.Поле = “Товары[“+(Выборка.НомерСтроки-1)+”].Количество”;
Сообщение.УстановитьДанные(Ссылка.ПолучитьОбъект());
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
Проводка = Движения.Добавить();
Проводка.Период = Ссылка.Дата;
Проводка.СчетДТ = ПланыСчетов.Хозрасчетный.Себестоимость;
Проводка.СчетКТ = ПланыСчетов.Хозрасчетный.Товары;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] =Выборка.Номенклатура;
Проводка.КоличествоКт = Выборка.Количество;
Если Выборка.Количество <> 0 Тогда
Проводка.Сумма = Выборка.СуммаОстаток*Выборка.Количество/Выборка.КоличествоОстаток;
Иначе
Проводка.Сумма = 0;
КонецЕсли;
Если НЕ Отказ Тогда
Движения.Записывать = Истина;
Проводка = Движения.Добавить();
Проводка.Период = Ссылка.Дата;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Покупатели;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.Выручка;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Ссылка.Контрагент;
Проводка.Сумма = Ссылка.Товары.Итог(“Сумма”);
КонецЕсли;
КонецЦикла;
КонецПроцедуры</code>
Для документа “Выписка” реализовал движение, ввод на основании контрагентов все в общем модуле документа:
<code>Процедура ДвижениеПоБУ(Движения, Отказ)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| СУММА(ЕСТЬNULL(ВыпискаОплаты.Приход, 0)) КАК Приход,
| СУММА(ЕСТЬNULL(ВыпискаОплаты.Расход, 0)) КАК Расход,
| ВыпискаОплаты.Счет,
| МАКСИМУМ(ВыпискаОплаты.НомерСтроки) КАК НомерСтроки,
| ВыпискаОплаты.Контрагент
|ИЗ
| Документ.Выписка.Оплаты КАК ВыпискаОплаты
|ГДЕ
| ВыпискаОплаты.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ВыпискаОплаты.Контрагент,
| ВыпискаОплаты.Счет”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Счет = ПланыСчетов.Хозрасчетный.Покупатели ИЛИ Выборка.Счет = ПланыСчетов.Хозрасчетный.Поставщики Тогда
Если Выборка.Расход <> 0 Тогда
Проводка = Движения.Добавить();
Проводка.Период = Ссылка.Дата;
Проводка.СчетДТ = Выборка.Счет;
Проводка.СчетКТ = ПланыСчетов.Хозрасчетный.Банк;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Выборка.Контрагент;
Проводка.Сумма = Выборка.Расход;
КонецЕсли;
Если Выборка.Приход <> 0 Тогда
Проводка = Движения.Добавить();
Проводка.Период = Ссылка.Дата;
Проводка.СчетДТ = ПланыСчетов.Хозрасчетный.Банк;
Проводка.СчетКТ = Выборка.Счет;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Выборка.Контрагент;
Проводка.Сумма = Выборка.Приход;
КонецЕсли;
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Нельзя истользовать счет: “+Выборка.Счет;
Сообщение.Поле = “Товары[“+(Выборка.НомерСтроки-1)+”].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
Если НЕ Отказ Тогда
Движения.Записывать = Истина;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если УУ Тогда
Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина;
Для Каждого ТекСтрокаОплаты Из Оплаты Цикл
Если ТекСтрокаОплаты.Приход>0 Тогда
Движение = Движения.ВзаиморасчетыСКонтрагентами.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Контрагент = ТекСтрокаОплаты.Контрагент;
Движение.СуммаВзаиморасчетов = ТекСтрокаОплаты.Приход;
КонецЕсли;
Если ТекСтрокаОплаты.Расход>0 Тогда
Движение = Движения.ВзаиморасчетыСКонтрагентами.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Контрагент = ТекСтрокаОплаты.Контрагент;
Движение.СуммаВзаиморасчетов = ТекСтрокаОплаты.Расход;
КонецЕсли;
КонецЦикла;
Иначе
ОбработкаДокументов.ОчиститьУУ(Движения);
КонецЕсли;
Если БУ Тогда
ДвижениеПоБУ(Движения.Хозрасчетный, Отказ);
Иначе
ОбработкаДокументов.ОчиститьБУ(Движения);
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ХозрасчетныйОстатки.Счет,
| ХозрасчетныйОстатки.Субконто1,
| ХозрасчетныйОстатки.СуммаОстаток
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(
| ,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Покупатели)
| ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Поставщики),
| ,
| Субконто1 = &Контрагент) КАК ХозрасчетныйОстатки”;
Запрос.УстановитьПараметр(“Контрагент”, ДанныеЗаполнения);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.СуммаОстаток > 0 и Выборка.Счет = ПланыСчетов.Хозрасчетный.Покупатели Тогда
НоваяСтрока = Оплаты.Добавить();
НоваяСтрока.Контрагент = ДанныеЗаполнения;
НоваяСтрока.Приход = Выборка.СуммаОстаток;
НоваяСтрока.Счет = Выборка.Счет;
ИначеЕсли Выборка.СуммаОстаток < 0 и Выборка.Счет = ПланыСчетов.Хозрасчетный.Поставщики Тогда
НоваяСтрока = Оплаты.Добавить();
НоваяСтрока.Контрагент = ДанныеЗаполнения;
НоваяСтрока.Расход = -Выборка.СуммаОстаток;
НоваяСтрока.Счет = Выборка.Счет;
КонецЕсли;
КонецЦикла;
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Нет данных для заполения”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
КонецПроцедуры
</code>
Очень долго мучился с “Актом сверки”, реализовал табл часть и в реквизиты добавил “ОстатокНачало” и “ОстатокКонец” для удобного вывода в печати, саму печать реализовал с помощью контструктора
<code>
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьТаблЧасть(Объект.Контрагент,Объект.ДатаНачала,Объект.ДатаОкончания);
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьТаблЧасть(Контрагент,ДатаНачала,ДатаОкончания)
ЗапросУв = Новый Запрос;
ЗапросУв.Текст =
“ВЫБРАТЬ
| ХозрасчетныйОстаткиИОбороты.Регистратор КАК Документ,
| ХозрасчетныйОстаткиИОбороты.СуммаОборотДт КАК Приход,
| ХозрасчетныйОстаткиИОбороты.СуммаОборотКт КАК Расход
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.ОстаткиИОбороты(&НачалоПериода, &КонецПериода, Регистратор, , , , Субконто1 = &Контрагент) КАК ХозрасчетныйОстаткиИОбороты
|ГДЕ
| (ХозрасчетныйОстаткиИОбороты.Регистратор ССЫЛКА Документ.Операция
| ИЛИ ХозрасчетныйОстаткиИОбороты.Регистратор ССЫЛКА Документ.ПоступлениеТоваров
| ИЛИ ХозрасчетныйОстаткиИОбороты.Регистратор ССЫЛКА Документ.Выписка
| ИЛИ ХозрасчетныйОстаткиИОбороты.Регистратор ССЫЛКА Документ.РеализацияТоваров)”;
ЗапросУв.УстановитьПараметр(“КонецПериода”, КонецДня(Объект.ДатаОкончания));
ЗапросУв.УстановитьПараметр(“НачалоПериода”, Объект.ДатаНачала);
ЗапросУв.УстановитьПараметр(“Контрагент”, Объект.Контрагент);
Результат = ЗапросУв.Выполнить().Выгрузить();
Объект.Сверка.Загрузить(Результат);
Объект.ДолгНачало = ЗначениеНаДату(Объект.Контрагент,Объект.ДатаНачала);
Граница = Новый Граница(КонецДня(Объект.ДатаОкончания),ВидГраницы.Включая);
Объект.ДолгКонец = ЗначениеНаДату(Объект.Контрагент,Граница);
КонецПроцедуры // ЗаполнитьТаблЧасть()
Функция ЗначениеНаДату(Контрагент,Дата)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| СУММА(ХозрасчетныйОстатки.СуммаОстаток) КАК Сумма
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(
| &Начало,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Покупатели)
| ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Поставщики),
| ,
| Субконто1 = &Контрагент) КАК ХозрасчетныйОстатки”;
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Запрос.УстановитьПараметр(“Начало”, Дата);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат 0;
КонецЕсли;
ВыборкаДетальныеЗаписи = Результат.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();
Возврат ВыборкаДетальныеЗаписи.Сумма;
КонецФункции // ЗначениеНаДату()
</code>
Задание выполнила
Во всех документах добавлены реквизиты УУ, БУ (Булево). Добавлен вид субконто “Контрагенты” для счетов 60,62, В регистр бухгалтерии добавлен ресурс “Количество”.
==========================================================================
============//Модуль объекта док Поступление товаров
Если УУ тогда… проведение по регистрам накопления…
Если БУ тогда
//проводки по Регистру бухгалтерии
ТаблицаТоваров = ОбщийМодульБухгНаСервере.ПолучитьДанныеПоТоварамДокумента(Ссылка, Дата, ПланыСчетов.Управленческий.Поставщики,Поставщик).Выгрузить();
СуммаУслуг = ОбщийМодульБухгНаСервере.ПолучитьДанныеПоУслугамДокумента(Ссылка);
Движения.РегистрБухгалтерии.Загрузить(ТаблицаТоваров);
Движения.РегистрБухгалтерии.Записывать = Истина;
Если ЗначениеЗаполнено(СуммаУслуг) тогда
Проводка = Движения.РегистрБухгалтерии.Добавить(); //Дт26 кт60
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Управленческий.Затраты;
Проводка.СчетКт = ПланыСчетов.Управленческий.Поставщики;
Проводка.СубконтоКт.Контрагенты = Поставщик;
Проводка.Сумма = СуммаУслуг;
КонецЕсли;
КонецЕсли;
===========================================================================
==============// ОбщийМодульБухгНаСервере
Функция ПолучитьДанныеПоТоварамДокумента(Ссылка, Дата, КорСчет,Контрагент) Экспорт
ИмяТаблицы = “Документ.”+Ссылка.Метаданные().Имя+”.Товары”;
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| &Период,
| ДокТовары.Номенклатура КАК СубконтоДт1,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Номенклатура) КАК ВидСубконтоДт1,
| ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары) КАК СчетДт,
| &КорСчет КАК СчетКт,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты) КАК ВидСубконтоКт1,
| &Контрагент КАК СубконтоКт1,
| СУММА(ДокТовары.Количество * ДокТовары.К) КАК Количество,
| СУММА(ДокТовары.Сумма) КАК Сумма
|ИЗ
| &ДокументТовары КАК ДокТовары
|ГДЕ
| ДокТовары.Ссылка = &Ссылка
| И ДокТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
|
|СГРУППИРОВАТЬ ПО
| ДокТовары.Номенклатура”;
Запрос.Текст = СтрЗаменить(Запрос.Текст, “&ДокументТовары”, ИмяТаблицы);
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Период”, Дата);
Запрос.УстановитьПараметр(“КорСчет”, КорСчет);
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Возврат Запрос.Выполнить();
КонецФункции
===============================
Функция ПолучитьДанныеПоУслугамДокумента(Ссылка) Экспорт
ИмяТаблицы = “Документ.”+Ссылка.Метаданные().Имя+”.Товары”;
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| СУММА(ДокТовары.Сумма) КАК Сумма
|ИЗ
| &ДокументТовары КАК ДокТовары
|ГДЕ
| ДокТовары.Ссылка = &Ссылка
| И ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)”;
Запрос.Текст = СтрЗаменить(Запрос.Текст, “&ДокументТовары”, ИмяТаблицы);
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Возврат Запрос.Выполнить().Выгрузить().Итог(“Сумма”);
КонецФункции
============// конец общего модуля
=======================================================================
Расчет среднескользящей стоимости в док “Реализация товаров” как давался в теории.
===========// Модуль объекта док Реализация товаров
Процедура СписатьПоСреднескользящей(Отказ)
Движения.РегистрБухгалтерии.Очистить();
Движения.РегистрБухгалтерии.Записать();
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Количество КАК КолДок,
| Товары.Сумма КАК СумДок,
| Товары.НомерСтроки,
| ЕСТЬNULL(РегистрБухгалтерииОстатки.СуммаОстатокДт, 0) КАК СумОст,
| ЕСТЬNULL(РегистрБухгалтерииОстатки.КоличествоОстатокДт, 0) КАК КолОст
|ИЗ
| (ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество) КАК Количество,
| СУММА(РеализацияТоваровТовары.Сумма) КАК Сумма,
| МАКСИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура) КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.РегистрБухгалтерии.Остатки(
| &Момент,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары),
| ,
| Субконто1 В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТовары.Номенклатура
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга))) КАК РегистрБухгалтерииОстатки
| ПО Товары.Номенклатура = РегистрБухгалтерииОстатки.Субконто1”;
Запрос.УстановитьПараметр(“Момент”, МоментВремени());
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Нехватка = Выборка.КолДок – Выборка.КолОст;
Если Нехватка>0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Товара “+Выборка.Номенклатура+” не достаточно в количестве “+Нехватка;
Сообщение.Поле = “Товары[“+(Выборка.НомерСтроки-1)+”].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
Проводка = Движения.РегистрБухгалтерии.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Управленческий.Себестоимость;
Проводка.СчетКт = ПланыСчетов.Управленческий.Товары;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура;
Проводка.Количество = Выборка.КолДок;
Если Выборка.КолОст<>0 Тогда
Проводка.Сумма = Выборка.СумОст*Выборка.КолДок/Выборка.КолОст;
Иначе
Проводка.Сумма = 0;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
================================
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если УУ …..проведение по регистрам накопления… КонецЕсли;
Если БУ тогда
СписатьПоСреднескользящей(Отказ);
Если НЕ Отказ Тогда
Движения.РегистрБухгалтерии.Записывать = Истина;
Проводка = Движения.РегистрБухгалтерии.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Управленческий.Покупатели;
Проводка.СчетКт = ПланыСчетов.Управленческий.Выручка;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Покупатель;
Проводка.Сумма = Товары.Итог(“Сумма”);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
==================// конец Модуля объекта док Реализация товаров
===============================================================================
Формирование проводок в док “Выписка”
Процедура ОбработкаПроведения(Отказ, Режим)
Если УУ Тогда …. КонецЕсли;
Если БУ тогда
//проводки по Регистру бухгалтерии
Движения.РегистрБухгалтерии.Записывать = Истина;
Для каждого ТекСтрокаКлиенты Из Клиенты Цикл
Проводка = Движения.РегистрБухгалтерии.Добавить();
Проводка.Период = Дата;
//51 – 62
Если ТекСтрокаКлиенты.Приход>0 тогда
Проводка.СчетДт = ПланыСчетов.Управленческий.Банк;
Проводка.СчетКт = ТекСтрокаКлиенты.СчетРасчетов;
Проводка.СубконтоКт.Контрагенты = ТекСтрокаКлиенты.Контрагент;
Проводка.Сумма = ТекСтрокаКлиенты.Приход;
Иначе //60 – 51
Проводка.СчетДт = ТекСтрокаКлиенты.СчетРасчетов;
Проводка.СубконтоДт.Контрагенты = ТекСтрокаКлиенты.Контрагент;
Проводка.СчетКт = ПланыСчетов.Управленческий.Банк;
Проводка.Сумма = ТекСтрокаКлиенты.Расход;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
======================
Заполнение “Выписки” на основании контрагента реализовано в модуле объекта док “Выписка” через запрос в процедуре
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
//ввод на основании спр Контрагенты
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
Контрагент = ДанныеЗаполнения.Ссылка;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ РАЗЛИЧНЫЕ
| РегистрБухгалтерииОстатки.Счет КАК СчетРасчетов,
| РегистрБухгалтерииОстатки.Субконто1 КАК Контрагент,
| СУММА(РегистрБухгалтерииОстатки.СуммаОстатокДт) КАК Приход,
| СУММА(РегистрБухгалтерииОстатки.СуммаОстатокКт) КАК Расход
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерии.Остатки(&Дата, , , Субконто1 = &Контрагент) КАК РегистрБухгалтерииОстатки
|
|СГРУППИРОВАТЬ ПО
| РегистрБухгалтерииОстатки.Счет,
| РегистрБухгалтерииОстатки.Субконто1”;
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Запрос.УстановитьПараметр(“Дата”,ТекущаяДата());
Результат = Запрос.Выполнить();
Если не Результат.Пустой() Тогда
ТЗ = Результат.Выгрузить();
Клиенты.Загрузить(ТЗ);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
======================================================================================
Новый док “Акт сверки взаиморасчетов”. В реквизиты шапки добавлены ДолгНаНачало, ДолгНаКонец.
Реализовано заполнение документа на основании данных регистра бухгалтерии (Остатки и обороты).
Печать акта создана конструктором печати с выводом долга на начало и долга на конец.
====================// Модуль формы док “АктСверкиВзаиморасчетов”
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьАктНаСервере();
КонецПроцедуры
==============================
&НаСервере
Процедура ЗаполнитьАктНаСервере() экспорт
ДокОбъект = РеквизитФормыВЗначение(“Объект”);
Если НЕ ЗначениеЗаполнено(ДокОбъект.Контрагент) Тогда
Сообщить(“Не выбран контрагент!”,СтатусСообщения.Важное);
Возврат;
КонецЕсли;
Если НЕ ЗначениеЗаполнено(ДокОбъект.ДатаОкончанияСверки) Тогда
Сообщить(“Не выбрана дата окончания сверки!”,СтатусСообщения.Внимание);
Возврат;
КонецЕсли;
Если ДокОбъект.ДатаОкончанияСверки < ДокОбъект.ДатаНачалаСверки Тогда
Сообщить(“Неверно задан период сверки расчетов!”,СтатусСообщения.БезСтатуса);
Возврат;
КонецЕсли;
ДокОбъект.Документы.Очистить();
ДатаНачала = ДокОбъект.ДатаНачалаСверки;
ДатаОкончания = ДокОбъект.ДатаОкончанияСверки;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РегистрБухгалтерииОстаткиИОбороты.СуммаОборотДт КАК СуммаУвеличенияДолга,
| РегистрБухгалтерииОстаткиИОбороты.СуммаОборотКт КАК СуммаУменьшенияДолга,
| РегистрБухгалтерииОстаткиИОбороты.Регистратор КАК Документ,
| РегистрБухгалтерииОстаткиИОбороты.Регистратор.Дата КАК РегистраторДата
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерии.ОстаткиИОбороты(&ДатаНачала, &ДатаОкончания, Регистратор, , , , Субконто1 = &Контрагент) КАК РегистрБухгалтерииОстаткиИОбороты
|
|УПОРЯДОЧИТЬ ПО
| РегистраторДата,
| Документ”;
Запрос.УстановитьПараметр(“Контрагент”,ДокОбъект.Контрагент);
Запрос.УстановитьПараметр(“ДатаНачала”,ДатаНачала);
Запрос.УстановитьПараметр(“ДатаОкончания”, ?(ЗначениеЗаполнено(ДатаОкончания), Новый Граница(КонецДня(ДатаОкончания), ВидГраницы.Включая),Неопределено));
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Документ = Неопределено Тогда
Продолжить;
КонецЕсли;
Строка = ДокОбъект.Документы.Добавить();
Строка.Документ = Выборка.Документ;
Строка.СуммаУвеличенияДолга = Выборка.СуммаУвеличенияДолга;
Строка.СуммаУменьшенияДолга = Выборка.СуммаУменьшенияДолга;
КонецЦикла;
Запрос.Текст =
“ВЫБРАТЬ
| РегистрБухгалтерииОстаткиИОбороты.СуммаНачальныйОстаток КАК ДолгНаНачало,
| РегистрБухгалтерииОстаткиИОбороты.СуммаКонечныйОстаток КАК ДолгНаКонец
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерии.ОстаткиИОбороты(&ДатаНачала, &ДатаОкончания, , , , , Субконто1 = &Контрагент) КАК РегистрБухгалтерииОстаткиИОбороты”;
Результат = Запрос.Выполнить();
ДокОбъект.ДолгНаНачало = Результат.Выгрузить().Итог(“ДолгНаНачало”);
ДокОбъект.ДолгНаКонец = Результат.Выгрузить().Итог(“ДолгНаКонец”);
//ОстатокНаКонец = ОстатокНаНачало + ПоДаннымОрганизации.Итог(“Дебет”) – ПоДаннымОрганизации.Итог(“Кредит”);
ЗначениеВРеквизитФормы(ДокОбъект,”Объект”);
Модифицированность = Истина;
КонецПроцедуры
=========================================================================
1. Добавил реквизиты в документы “ОтражатьВУправленческомУчете”, “ОтражатьВБухгалтерскомУчете” для управления проведением документов.
2. Добавил аналитику по контрагенту во взаиморасчетах с поставщиками и покупателями.
3. Реализовал списание согласно требованию в задании.Запросом получаю необходимые данные,обхожу выборку запроса, контролирую остатки “Нехватка = Выборка.КолДок – Выборка.КолОст;
” и далее по методике.
4.Заполнение реквизитов документа “Выписка” при вводе на основании эл.спр. “Контрагенты” делаю в процедуре модуля документа ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка). Получаю остатки по контрагенту запросом к таблице РегистрБухгалтерии.Управленческий.Остатки на момент времени документа.Документ еще не записан в бд – нет ссылки, поэтому записываю документ – получаю ссылку.Вот тут у меня сомнения-правильно ли делаю?Либо получать остатки на дату, либо не записывая документ, создавать ссылку к нему и далее при записи нового документа присваивать эту ссылку.Либо я чего-то не понял в условии задачи.
5. Для заполнения таб.части “Акта сверки взаиморасчетов” делаю запрос к РегистрБухгалтерии.Управленческий.ОстаткиИОбороты,
устанавливаю соответствующие параметры(периодичность – Регистратор), анализирую обороты, остатки 60.01 и 62.01 счетов. Формирую печатную форму по классической схеме ( макет -ТабличныйДокумент)
Ход решения ДЗ № 11:
В документах:
– Авансовый отчет;
– Выписка;
– ПоступлениеТоваровУслуг;
– РеализацияТоваровУслуг
созданы булевские реквизиты «УУ» и «БУ».
Остались неохваченными документы:
– КонтактСКонтрагентом – т.к. он не делает движений ни управленческому, ни по бухгалтерскому учетам;
– ОперацияБух – т.к. данный документ однозначно двигает регистр бухгалтерии – собственно, для этого он и предназначен.
Для документов имеющих реквизиты УУ и БУ, откорректированы обработки проведения.
В процедуру ОбработкаПроведения модуля объекта документа «ПоступлениеТоваровУслуг» добавил проведение по БУ для строк табличной части «Услуги».
Либо я не понял фразу задания «Необходимо организовать аналитический учет взаиморасчетов с покупателями и поставщиками в разрезе контрагентов. Обеспечьте проведение «Поступления товаров» по созданному аналитическому счету», либо это сделал уже в предыдущем ДЗ – на счетах 60 и 62 уже присутствует субконто «Контрагенты», и документ «ПоступлениеТоваровУслуг», при проведении по БУ, пишет в это субконто контрагента из шапки документа.
Для того, чтобы списывать товары по среднескользящей оценке, ввел признак «Количественный» на плане счетов «Хозрасчетный» и в регистре бухгалтерии «Хозрасчетный» добавил ресурс «Количество», связанный с признаком «Количественный» плана счетов «Хозрасчетный».
Изменена процедура «ОбработкаПроведения» документа «РеализацияТоваровУслуг» – добавлено проведение по регистру бухгалтерии.
Выполнено аналогично соответствующему видеоуроку. Одну из возможностей оптимизации – проверять остатки перед проведением по БУ только в том случае, если не было движения по УУ – отмел, т.к., в одном из предыдущих ДЗ был пункт на создание кнопки «Безусловное проведение», и, следовательно, в разрабатываемой конфигурации, в принципе, может быть расхождение количества по УУ и по БУ.
Код процедуры: http://paste.org.ru/?1nc2r2
Добавил реквизит «СчетБУ» в табличную часть документа «Выписка».
В документе «Выписка» реализовал механизм формирования проводок по БУ: http://paste.org.ru/?vakf15
Совершенно неожиданно натолкнулся на ошибку:
Если, в обработке проведения, написать фразу типа Движение.Период = МоментВремени(), то период движения будет пустым!!! При этом функция МоментВремени() отрабатывает правильно, ее возвращаемое значение отнюдь не пусто.
Как вы думаете, с чем это связано?
Создан, согласно задания, механизм ввода документа «Выписка» на основании элемента справочника «Контрагенты».
Код, отвечающий за работу данного механизма, помещен в модуль объекта документа «Выписка»: http://paste.org.ru/?f2fp3q
Создан документ «АктСверкиВзаиморасчетов». Трудностей при создании документа не было.
Вот так выглядит код модуля формы данного документа: http://paste.org.ru/?fgvwb8
Теперь и ДЗ11 сделал.
При проведении по бух.регистру:
сразу сделал с учетом единиц измерения(с учетом коэффициента).
При списании сумм, если продаем последнее в “штуках”, то и сумму остатка целиком списываю
В акте сверки сам не догадался заполнять табл.часть через Запрос/выгрузить/загрузить.
Ну и печатные формы через СКД самостоятельно пока плохо получается, подглядывал в Ваше решение. Накопившиеся вопросы отправил в мастер группу.
Домашнее задание выполнил.
Проблем не возникло, в основном рутинное создание/модификация объектов.
Задержку с отчетом, вызвала командировка.
P.S. Евгений есть ли возможность отчитаться по всем домашним заданиям, т.к. бывают командировки и невсегда возможность вовремя отчитаться среди недели?
Отчитываться нужно по мере выполнения. Даже если это делается с опозданием, то это не страшно.
выполнил. полный отчет не могу написать… Поверьте на слово…
Задание выполнил.
1. Проводки документов поступления и реализации.
Добавил флаги УУ, БУ для ПоступТУ, Авансовый отчет, Реализация ТУ.
В план видов характеристик “ВидыСубконто” добавил предопределенный элемент “Контрагент”.
Для счетов 60, 62 добавил соответствующий вид субконто.
В план счетов “Основной” добавил новый признак учета “Количественный”, выставил в истину для счетов – 41.01, 41.02.
В регистр бухгалтерии “Управленческий” добавил новый ресурс “Количество”, забалансовый, с признаком учета “Количественный”.
Модифицировал проводки соответствующих документов.
//Модуль документа “ПоступлениеТоваровУслуг”
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если УУ Тогда
ВыполнитьДвиженияПоРегистрамУправленческогоУчета(Отказ);
КонецЕсли;
Если БУ Тогда
ВыполнитьДвиженияПоРегистрамБухгалтерскогоУчета(Отказ);
КонецЕсли;
КонецПроцедуры
Если УУ Тогда ВыполнитьДвиженияПоРегистрамУправленческогоУчета(Отказ); КонецЕсли; Если БУ Тогда ВыполнитьДвиженияПоРегистрамБухгалтерскогоУчета(Отказ); КонецЕсли; КонецПроцедуры
Процедура ВыполнитьДвиженияПоРегистрамУправленческогоУчета(Отказ)
//По регистру ТоварыНаСкладах
ТаблицаТоваровОприходованныхНаСклад = ПолучитьТаблицуТоваровОприхцФодованныхНаСклад();
Движения.ТоварыНаСкладах.Записывать = Истина;
Движения.ТоварыНаСкладах.Загрузить(ТаблицаТоваровОприходованныхНаСклад);
Движения.Закупки.Записывать = Истина;
Для Каждого ТекСтрока Из Товары Цикл
//По регистру Закупки
НовоеДвижение = Движения.Закупки.Добавить();
НовоеДвижение.Активность = Истина;
НовоеДвижение.Период = Дата;
НовоеДвижение.Контрагент = Контрагент;
НовоеДвижение.Номенклатура = ТекСтрока.Номенклатура;
НовоеДвижение.Количество = ТекСтрока.Количество*ТекСтрока.Коэффициент;
НовоеДвижение.Стоимость = ТекСтрока.Сумма;
КонецЦикла;
//По регистру Взаиморасчеты с контрагентами
Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина;
НоваяЗапись = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход();
НоваяЗапись.Период = Дата;
НоваяЗапись.Контрагент = Контрагент;
НоваяЗапись.Сумма = Товары.Итог(“Сумма”);
КонецПроцедуры
Процедура ВыполнитьДвиженияПоРегистрамБухгалтерскогоУчета(Отказ)
Движения.Управленческий.Записывать = Истина;
Для Каждого Текстрока Из Товары Цикл
//по регистру бухгалтерии Управленческий
НовоеДвижение = Движения.Управленческий.Добавить();
НовоеДвижение.Период = Дата;
Если ТекСтрока.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
НовоеДвижение.СчетДт = ПланыСчетов.Основной.Затраты;
Иначе
НовоеДвижение.СчетДт = ПланыСчетов.Основной.Товары;
НовоеДвижение.СубконтоДт.Товар = ТекСтрока.Номенклатура;
КонецЕсли;
НовоеДвижение.СчетКт = ПланыСчетов.Основной.Поставщики;
НовоеДвижение.СубконтоКт.Контрагент = Контрагент;
НовоеДвижение.КоличествоДт = Текстрока.Количество*Текстрока.Коэффициент;
НовоеДвижение.Сумма = ТекСтрока.Сумма;
КонецЦикла;
КонецПроцедуры
</code>
//Модуль документа “РеализацияТоваровУслуг”
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если УУ Тогда
ВыполнитьДвиженияПоРегистрамУправленческогоУчета(Отказ);
КонецЕсли;
Если БУ Тогда
ВыполнитьДвиженияПоРегистрамБухгалтерскогоУчета(Отказ);
КонецЕсли;
КонецПроцедуры
Процедура ВыполнитьДвиженияПоРегистрамБухгалтерскогоУчета(Отказ)
//По регистру Управленческий
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| МИНИМУМ(РеализацияТоваровУслугТовары.НомерСтроки) КАК НомерСтроки,
| РеализацияТоваровУслугТовары.Номенклатура,
| СУММА(РеализацияТоваровУслугТовары.Количество*РеализацияТоваровУслугТовары.Коэффициент) КАК Количество,
| СУММА(РеализацияТоваровУслугТовары.Сумма) КАК Сумма
| ПОМеСТИТЬ Товары
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровУслугТовары.Номенклатура
|;
|//////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Товары.НомерСтроки,
| Товары.Номенклатура,
| Товары.Количество КАК КоличествоДок,
| Товары.Сумма КАК СуммаДок,
| ЕСТЬNULL(УправленческийОстатки.КоличествоОстаток,0) КАК КоличествоОстаток,
| ЕСТЬNULL(УправленческийОстатки.СуммаОстаток,0) КАК СуммаОстаток
|ИЗ
| Товары КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки(&Период, Счет = ЗНАЧЕНИЕ(ПланСчетов.Основной.Товары)
| ,, Субконто1 В (ВЫБРАТЬ Товары.Номенклатура ИЗ Товары КАК Товары)) КАК УправленческийОстатки
| ПО Товары.Номенклатура = УправленческийОстатки.Субконто1
|”;
Запрос.УстановитьПараметр(“Период”, Новый Граница(МоментВремени(), ВидГраницы.Включая));
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Нехватка = Выборка.КоличествоДок – Выборка.КоличествоОстаток;
Если Нехватка > 0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Товара ” + Строка(Выборка.Номенклатура) + ” не достаточно в количестве ” + Нехватка;
Сообщение.Поле = “Товары[” + (Выборка.НомерСтроки – 1) + “].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
НоваяЗапись = Движения.Управленческий.Добавить();
НоваяЗапись.Период = Дата;
НоваяЗапись.СчетДт = ПланыСчетов.Основной.Себестоимость;
НоваяЗапись.СчетКт = ПланыСчетов.Основной.Товары;
НоваяЗапись.СубконтоКт.Товар = Выборка.Номенклатура;
НоваяЗапись.КоличествоКт = Выборка.КоличествоДок;
НоваяЗапись.Сумма = ?(Выборка.КоличествоОстаток = 0, 0, (Выборка.СуммаОстаток*Выборка.КоличествоДок)/Выборка.КоличествоОстаток);
КонецЦикла;
Движения.Управленческий.Записывать = НЕ Отказ;
Если НЕ Отказ Тогда
НоваяЗапись = Движения.Управленческий.Добавить();
НоваяЗапись.Период = Дата;
НоваяЗапись.СчетДт = ПланыСчетов.Основной.Покупатели;
НоваяЗапись.СубконтоДт.Контрагент = Контрагент;
НоваяЗапись.СчетКт = ПланыСчетов.Основной.Выручка;
НоваяЗапись.Сумма = Товары.Итог(“Сумма”);
КонецЕсли;
КонецПроцедуры
</code>
2. Документ “Выписка”
Указал что основанием для документа может являться справочник “Контрагенты”
//Модуль документа “Выписка”
<code>
Процедура ВыполнитьДвиженияПоРегистрамБухгалтерскогоУчета(Отказ)
//По регистру Управленческий
Движения.Управленческий.Записывать = Истина;
ТаблицаПоКонтрагентам = Оплаты.Выгрузить();
ТаблицаПоКонтрагентам.Свернуть(“Контрагент, Счет”,”СуммаПрихода, СуммаРасхода”);
Для Каждого ТекСтрока ИЗ ТаблицаПоКонтрагентам Цикл
Если ТекСтрока.СуммаРасхода <> 0 Тогда
НоваяЗапись = Движения.Управленческий.Добавить();
НоваяЗапись.Период = Дата;
НоваяЗапись.СчетДт = ТекСтрока.Счет;
НоваяЗапись.СубконтоДт.Контрагент = ТекСтрока.Контрагент;
НоваяЗапись.СчетКт = ПланыСчетов.Основной.Банк;
НоваяЗапись.Сумма = ТекСтрока.СуммаРасхода;
КонецЕсли;
Если ТекСтрока.СуммаПрихода <> 0 Тогда
НоваяЗапись = Движения.Управленческий.Добавить();
НоваяЗапись.Период = Дата;
НоваяЗапись.СчетДт = ПланыСчетов.Основной.Банк;
НоваяЗапись.СчетКт = ТекСтрока.Счет;
НоваяЗапись.СубконтоКт.Контрагент = ТекСтрока.Контрагент;
НоваяЗапись.Сумма = ТекСтрока.СуммаПрихода;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ДолгиПокупателя.Субконто1 КАК Контрагент,
| ДолгиПокупателя.Счет КАК Счет,
| ДолгиПокупателя.СуммаОстатокДт КАК СуммаПрихода,
| 0 КАК СуммаРасхода
|ИЗ
| РегистрБухгалтерии.Управленческий.Остатки(, Счет = ЗНАЧЕНИЕ(ПланСчетов.Основной.Покупатели),, Субконто1 = &Контрагент) КАК ДолгиПокупателя
|ГДЕ
| ДолгиПокупателя.СуммаОстатокДт > 0
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| ДолгиПоставщику.Субконто1 КАК Контрагент,
| ДолгиПоставщику.Счет КАК Счет,
| 0 КАК СуммаПрихода,
| ДолгиПоставщику.СуммаОстатокКт КАК СуммаРасхода
|ИЗ
| РегистрБухгалтерии.Управленческий.Остатки(, Счет = ЗНАЧЕНИЕ(ПланСчетов.Основной.Поставщики),, Субконто1 = &Контрагент) КАК ДолгиПоставщику
|ГДЕ
| ДолгиПоставщику.СуммаОстатокКт > 0
|”;
Запрос.УстановитьПараметр(“Контрагент”, ДанныеЗаполнения);
Результат = Запрос.Выполнить().Выгрузить();
Для Каждого ТекСтрока Из Результат Цикл
НоваяСтрока = Оплаты.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтрока);
КонецЦикла;
КонецЕсли;
КонецПроцедуры
</code>
3. Документ “Акт сверки взаиморасчетов”
Создал документ, запретил проведение. Реализовал заполнение ТЧ и вывод печатной формы в модуле формы документа
//Модуль формы документа
<code>
&НаКлиенте
Процедура ЗаполнитьРасчеты(Команда)
ЗаполнитьТаблицуРасчетов();
КонецПроцедуры
&НаСервере
Функция ЗаполнитьТаблицуРасчетов()
Объект.Расчеты.Очистить();
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| УправленческийДвиженияССубконто.Регистратор КАК Документ,
| ВЫБОР
| КОГДА УправленческийДвиженияССубконто.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Основной.Покупатели)
| И УправленческийДвиженияССубконто.Регистратор ССЫЛКА Документ.РеализацияТоваровУслуг
| ИЛИ УправленческийДвиженияССубконто.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Основной.Поставщики)
| И УправленческийДвиженияССубконто.Регистратор ССЫЛКА Документ.Выписка
| ТОГДА УправленческийДвиженияССубконто.Сумма
| ИНАЧЕ 0
| КОНЕЦ КАК СуммаУвеличенияДолга,
| ВЫБОР
| КОГДА УправленческийДвиженияССубконто.СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Основной.Покупатели)
| И УправленческийДвиженияССубконто.Регистратор ССЫЛКА Документ.Выписка
| ИЛИ УправленческийДвиженияССубконто.СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Основной.Поставщики)
| И УправленческийДвиженияССубконто.Регистратор ССЫЛКА Документ.ПоступлениеТоваровУслуг
| ТОГДА УправленческийДвиженияССубконто.Сумма
| ИНАЧЕ 0
| КОНЕЦ КАК СуммаУменьшенияДолга
|ИЗ
| РегистрБухгалтерии.Управленческий.ДвиженияССубконто(
| &НачалоПериода,
| &КонецПериода,
| (Счет = ЗНАЧЕНИЕ(ПланСчетов.Основной.Покупатели) ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.Основной.Поставщики))
| И Субконто1 = &Контрагент,
| ,
| ) КАК УправленческийДвиженияССубконто”;
Запрос.УстановитьПараметр(“НачалоПериода”,Объект.НачалоПериода);
Запрос.УстановитьПараметр(“КонецПериода”,Новый Граница(Объект.КонецПериода, ВидГраницы.Включая));
Запрос.УстановитьПараметр(“Контрагент”,Объект.Контрагент);
Результат = Запрос.Выполнить().Выгрузить();
Для Каждого ТекСтрока Из Результат Цикл
НоваяСтрока = Объект.Расчеты.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтрока);
КонецЦикла;
КонецФункции
&НаКлиенте
Процедура Печать(Команда)
Если Объект.Ссылка.Пустая() Тогда
Сообщить(“Необходимо записать документ.”);
Возврат;
КонецЕсли;
ПолучитьПечатнуюФорму(Объект.Ссылка).Показать();
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьПечатнуюФорму(Ссылка)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| &НачалоПериода КАК Период,
| УправленческийОстаткиНачалоПериода.СуммаОстатокДт КАК Остаток
|ИЗ
| РегистрБухгалтерии.Управленческий.Остатки(
| &НачалоПериода,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Основной.Поставщики)
| ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.Основной.Покупатели),
| ,
| Субконто1 = &Контрагент) КАК УправленческийОстаткиНачалоПериода
|ГДЕ
| УправленческийОстаткиНачалоПериода.СуммаОстатокДт > 0
|
|ОБЪЕДИНИТЬ ВСЕ
|
|
|ВЫБРАТЬ
| &КонецПериода КАК Период,
| УправленческийОстаткиКонецПериода.СуммаОстатокДт КАК Остаток
|ИЗ
| РегистрБухгалтерии.Управленческий.Остатки(
| &КонецПериода,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Основной.Поставщики)
| ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.Основной.Покупатели),
| ,
| Субконто1 = &Контрагент) КАК УправленческийОстаткиКонецПериода
|ГДЕ
| УправленческийОстаткиКонецПериода.СуммаОстатокДт > 0
|”;
Запрос.УстановитьПараметр(“НачалоПериода”, Ссылка.НачалоПериода);
Запрос.УстановитьПараметр(“КонецПериода”, КонецДня(Ссылка.КонецПериода)+1);
Запрос.УстановитьПараметр(“Контрагент”, Ссылка.Контрагент);
ТаблицаОстатков = Запрос.Выполнить().Выгрузить();
ТабДок = Новый ТабличныйДокумент;
Макет = Документы.АктСверкиВзаиморасчетов.ПолучитьМакет(“Макет”);
ОбластьШапка = Макет.ПолучитьОбласть(“ОбластьШапка”);
ОбластьШапка.Параметры.НазваниеДокумента = “Акт сверки взаиморасчетов”;
ОбластьШапка.Параметры.Номер = Ссылка.Номер;
ОбластьШапка.Параметры.Дата = Ссылка.Дата;
ОбластьШапка.Параметры.Контрагент = Ссылка.Контрагент;
ОбластьШапка.Параметры.НачалоПериода = Формат(Ссылка.НачалоПериода, “ДФ=dd.MM.yyyy”);
ОбластьШапка.Параметры.КонецПериода = Формат(Ссылка.КонецПериода, “ДФ=dd.MM.yyyy”);
НайденнаяСтрокаПериодНачало = ТаблицаОстатков.Найти(Ссылка.НачалоПериода, “Период”);
ОбластьШапка.Параметры.ОстатокНаНачалоПериода = ?(ЗначениеЗаполнено(НайденнаяСтрокаПериодНачало),НайденнаяСтрокаПериодНачало.Остаток,0);
НайденнаяСтрокаПериодКонец = ТаблицаОстатков.Найти(КонецДня(Ссылка.КонецПериода)+1, “Период”);
ОбластьШапка.Параметры.ОстатокНаКонецПериода = ?(ЗначениеЗаполнено(НайденнаяСтрокаПериодКонец),НайденнаяСтрокаПериодКонец.Остаток,0);
ТабДок.Вывести(ОбластьШапка);
Для Каждого ТекСтрока Из Ссылка.Расчеты Цикл
ОбластьСтрока = Макет.ПолучитьОбласть(“ОбластьСтрока”);
ЗаполнитьЗначенияСвойств(ОбластьСтрока.Параметры, ТекСтрока);
ТабДок.Вывести(ОбластьСтрока);
КонецЦикла;
Возврат ТабДок;
КонецФункции
</code>
Немного запутался в параметрах виртуальной таблицы “ДвиженияССубконто”. Изначально написал вместо условия “Субконто1 = &Контрагент” условие “СубконтоДт1 = &Контрагент ИЛИ СубконтоКт1 = &Контрагент”. Результат был странным. Вывелись только Поступления товаров и услуг, т.е. отработало только условие по СубконтоКт1, т.к. поступление списывает в кредит 62 счета как раз с таким субконто. Если оставить только СубконтоДт1 = &Контрагент, то Поступления естественно в результат не попадают, зато появляются реализация и Выписка, т.е. те документы которые пишут в дебет с этим субконто. Разъясните, пожалуйста, почему условия “Субконто1 = &Контрагент” и “СубконтоДт1 = &Контрагент ИЛИ СубконтоКт1 = &Контрагент” отрабатываются по разному.
В решении этот момент разбирается.
Сделано, и снова но …
При формировании проводок на 41.Х счет я тоже сделал универсальную процедуру. Добавил СубКонты на 60 и 71 счета. И в процедуре заполнял кредитовые счета и субконты.
А с механизмом контроля счетов групп в проводках у меня получилось все намного проще(может и не верно, но работает) чем в Вашем решении. В модуле НабораЗаписей регистра Бух. В процедуре ПередЗаписью в список собираю использовнные в проводках счета. СписокСчетов в запрос как параметр в условие “В”. И запрос на выборку первого счета который имеет родителем кого-то из списка. И если результат выполнения запроса не пустой, значит бракуем запись в БД.
Зачем в вашем решении вводиться доп.реквизит, заполняется, сбрасывается, проверяется я не понял. И “глобально” зачем в платформе такие пляски с планом счетов тоже не понимаю. Методы “посмотреть вверх по иерархии” есть. Понятие иерархии/группы для счета есть. А метода ЭтоГруппа нет. Вопросы отправил в мастер группу.
Да, и еще не понял почему в модуле набора записей Вы в своем решении используете процедуру ПослеЗаписи, а не перед.
В обработчике события “Перед записью” набор записей еще не записан в базу данных. Поэтому запрос к таблице регистра бухгалтерии вернет либо пустой результат (для нового документа), либо движения прошлого состояния документа (для не нового документа).
Ок, рассмотрим в мастер-группе.
Простите, я ошибся страничкой. Про выполнение ДЗ10 написал в ДЗ11. ДЗ!) зачтется или переписать в правильное место?
Переписывать не нужно, разберемся.
<code>
Функция ПолучитьДанныеПоТМЦДокумента(Ссылка, Дата, КорСчет) Экспорт
ИмяТаблицы = “Документ.”+Ссылка.Метаданные().Имя+”.Товары”;
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| &Период,
| ДокТовары.Номенклатура КАК СубконтоДт1,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары) КАК ВидСубконтоДт1,
| ВЫБОР
| КОГДА ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(Плансчетов.Хозрасчетный.Затраты)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)
| КОНЕЦ КАК СчетДт,
| &КорСчет КАК СчетКт,
| СУММА(ДокТовары.Сумма) КАК Сумма,
| ДокТовары.Количество Как Количество
|ИЗ
| &ДокументТовары КАК ДокТовары
|ГДЕ
| ДокТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ДокТовары.Номенклатура,
| ДокТовары.Количество,
| ВЫБОР
| КОГДА ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(Плансчетов.Хозрасчетный.Затраты)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)
| КОНЕЦ”;
Запрос.Текст = СтрЗаменить(Запрос.Текст, “&ДокументТовары” , ИмяТаблицы);
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Период”, Дата);
Запрос.УстановитьПараметр(“КорСчет”, КорСчет);
Возврат Запрос.Выполнить();
КонецФункции
Функция ПолучитьДанныеПоТМЦДокумента(Ссылка, Дата, КорСчет) Экспорт
ИмяТаблицы = “Документ.”+Ссылка.Метаданные().Имя+”.Товары”; Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ | &Период, | ДокТовары.Номенклатура КАК СубконтоДт1, | ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары) КАК ВидСубконтоДт1, | ВЫБОР | КОГДА ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга) | ТОГДА ЗНАЧЕНИЕ(Плансчетов.Хозрасчетный.Затраты) | ИНАЧЕ ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары) | КОНЕЦ КАК СчетДт, | &КорСчет КАК СчетКт, | СУММА(ДокТовары.Сумма) КАК Сумма, | ДокТовары.Количество Как Количество |ИЗ | &ДокументТовары КАК ДокТовары |ГДЕ | ДокТовары.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ДокТовары.Номенклатура, | ДокТовары.Количество, | ВЫБОР | КОГДА ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга) | ТОГДА ЗНАЧЕНИЕ(Плансчетов.Хозрасчетный.Затраты) | ИНАЧЕ ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары) | КОНЕЦ”; Запрос.Текст = СтрЗаменить(Запрос.Текст, “&ДокументТовары” , ИмяТаблицы); Запрос.УстановитьПараметр(“Ссылка”, Ссылка); Запрос.УстановитьПараметр(“Период”, Дата); Запрос.УстановитьПараметр(“КорСчет”, КорСчет); Возврат Запрос.Выполнить();
КонецФункции
</code>
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ДвиженияОУ(Отказ,РежимПроведения);
Движения.РегистрБухгалтерииХозрасчетный.Очистить();
Движения.РегистрБухгалтерииХозрасчетный.Записать();
Запрос=Новый Запрос;
Запрос.Текст=
“ВЫБРАТЬ
| Товары.НомерСтроки,
| Товары.Номенклатура,
| Товары.Количество,
| Товары.Сумма,
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.КоличествоОстатокДт, 0) КАК КолвоОст,
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстатокДт, 0) КАК СуммаОст
|ИЗ
| (ВЫБРАТЬ
| МАКСИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки,
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество) КАК Количество,
| СУММА(РеализацияТоваровТовары.Сумма) КАК Сумма
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура) КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(
| &Момент,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары),
| ,
| Субконто1 В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТовары.Номенклатура
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка)) КАК РегистрБухгалтерииХозрасчетныйОстатки
| ПО Товары.Номенклатура = РегистрБухгалтерииХозрасчетныйОстатки.Субконто1”;
Граница=Новый Граница(МоментВремени(),ВидГраницы.Включая);
Запрос.УстановитьПараметр(“Момент”,Граница);
Запрос.УстановитьПараметр(“Ссылка”,Ссылка);
Выборка=Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Нехватка=Выборка.Количество()-Выборка.КолвоОст;
Если Нехватка>0 тогда
Сообщить(“Нехватка”);
Отказ=Истина
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
Проводка=Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период=Дата;
Проводка.СчетДт=ПланыСчетов.Хозрасчетный.Себестоимость;
Проводка.СчетКт=ПланыСчетов.Хозрасчетный.Товары;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Товары]=Выборка.Номенклатура;
Проводка.Количество=Выборка.Количество;
Если Выборка.КолвоОст<>0 тогда
Проводка.Сумма=Выборка.СуммаОст*Выборка.количество/Выборка.КолвоОст;
Иначе
Проводка.Сумма=0;
КонецЕсли;
Проводка1=Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка1.Период=Дата;
Проводка1.СчетДт=ПланыСчетов.Хозрасчетный.Покупатели;
Проводка1.СчетКт=ПланыСчетов.Хозрасчетный.Выручка;
Проводка1.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты]=Контрагент;
Если Выборка.КолвоОст<>0 тогда
Проводка1.Сумма=Выборка.Сумма;
Иначе
Проводка1.Сумма=0;
КонецЕсли;
КонецЦикла;
Если Не Отказ Тогда
Движения.РегистрБухгалтерииХозрасчетный.Записывать=Истина;
КонецЕсли;
КонецПроцедуры
</code>
Документ Выписка
<code>
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Взаиморасчеты.Записывать = Истина;
Движения.РегистрБухгалтерииХозрасчетный.Записывать=Истина;
Для Каждого ТекСтрокаОплаты Из Оплаты Цикл
Сч=ТекСтрокаОплаты.СчетВзаиморасчетов;
Если ТекСтрокаОплаты.Приход>0 Тогда
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Расход;
Движение.Период = Дата;
Движение.Контрагент = ТекСтрокаОплаты.Контрагент;
Движение.Сумма = ТекСтрокаОплаты.Приход;
Если Сч=ПланыСчетов.Хозрасчетный.Покупатели или
Сч=ПланыСчетов.Хозрасчетный.Поставщики тогда
Движение1=Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Движение1.Период=Дата;
Движение1.СчетДт=ПланыСчетов.Хозрасчетный.Банк;
Движение1.СчетКт=Сч;
Движение1.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты]=ТекСтрокаОплаты.Контрагент;
Движение1.Сумма=ТекСтрокаОплаты.Приход;
КонецЕсли;
КонецЕсли;
Если ТекСтрокаОплаты.Расход>0 Тогда
Движение = Движения.Взаиморасчеты.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Контрагент = ТекСтрокаОплаты.Контрагент;
Движение.Сумма = ТекСтрокаОплаты.Расход;
Если Сч=ПланыСчетов.Хозрасчетный.Покупатели или
Сч=ПланыСчетов.Хозрасчетный.Поставщики тогда
Движение1=Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Движение1.Период=Дата;
Движение1.СчетДт=Сч;
Движение1.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты]=ТекСтрокаОплаты.Контрагент;
Движение1.СчетКт=ПланыСчетов.Хозрасчетный.Банк;
Движение1.Сумма=ТекСтрокаОплаты.Расход;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
</code>
МодульФормы АктСверкиВзаиморасчетов
<code>
Запрос=Новый Запрос;
Запрос.Текст= “ВЫБРАТЬ
| ВложенныйЗапрос.Регистратор,
| ВложенныйЗапрос.СчетДт,
| ВложенныйЗапрос.СчетКт,
| ВложенныйЗапрос.Сумма
|ИЗ
| Документ.АктСверкиВзаиморасчетов КАК АктСверкиВзаиморасчетов,
| (ВЫБРАТЬ
| РегистрБухгалтерииХозрасчетный.Регистратор КАК Регистратор,
| РегистрБухгалтерииХозрасчетный.СчетДт КАК СчетДт,
| РегистрБухгалтерииХозрасчетный.СчетКт КАК СчетКт,
| РегистрБухгалтерииХозрасчетный.Сумма КАК Сумма
| ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный КАК РегистрБухгалтерииХозрасчетный) КАК ВложенныйЗапрос
|ГДЕ
| АктСверкиВзаиморасчетов.Контрагент = &Контрагент
| И (ВложенныйЗапрос.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Покупатели)
| ИЛИ ВложенныйЗапрос.СчетДт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Поставщики)
| ИЛИ (ВложенныйЗапрос.СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Покупатели)
| ИЛИ ВложенныйЗапрос.СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Поставщики)))
|
|СГРУППИРОВАТЬ ПО
| ВложенныйЗапрос.Регистратор,
| ВложенныйЗапрос.СчетДт,
| ВложенныйЗапрос.СчетКт,
| ВложенныйЗапрос.Сумма”;
Запрос.УстановитьПараметр(“Контрагент”,Объект.Контрагент);
Запрос.УстановитьПараметр(“ДатаНачала”,Объект.ДатаНачала);
Запрос.УстановитьПараметр(“ДатаОкончания”,Объект.ДатаОкончания);
ТЗ=Запрос.Выполнить().Выгрузить();
</code>
Из полученной таблицы заполняем табличную часть.
План счетов количественный
Регистр бухгалтерии количество
План видов хорактеристик контрагенты
Документ приход общий серверный содуль
Функция ПолучитьДанныеПоТМЦДокумента(Ссылка, Дата, КорСчет, Ссылка1) Экспорт
ИмяТаблицы = “Документ.”+Ссылка.Метаданные().Имя+”.Товары”;
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| &Период,
| ДокТовары.Номенклатура КАК СубконтоДт1,
| ВЫБОР
| КОГДА ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары)
| КОНЕЦ КАК ВидСубконтоДт1,
| ВЫБОР
| КОГДА ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Затраты)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)
| КОНЕЦ КАК СчетДт,
| &КорСчет КАК СчетКт,
| СУММА(ДокТовары.Сумма) КАК Сумма,
| СУММА(ВЫБОР
| КОГДА ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
| ТОГДА 0
| ИНАЧЕ ДокТовары.Количество
| КОНЕЦ) КАК КоличествоДт,
| ВЫБОР
| КОГДА &КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Поставщики)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| КОНЕЦ КАК ВидСубконтоКт1,
| &Контрагент КАК СубконтоКт1
|ИЗ
| &ДокументТовары КАК ДокТовары
|ГДЕ
| ДокТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ДокТовары.Номенклатура,
| ВЫБОР
| КОГДА ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары)
| КОНЕЦ,
| ВЫБОР
| КОГДА ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Затраты)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)
| КОНЕЦ”;
Запрос.Текст = СтрЗаменить(Запрос.Текст, “&ДокументТовары”, ИмяТаблицы);
Запрос.УстановитьПараметр(“Контрагент”, Ссылка1);
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Период”, Дата);
Запрос.УстановитьПараметр(“КорСчет”, КорСчет);
Возврат Запрос.Выполнить();
КонецФункции
реализация товара
Если Бу Тогда
Движения.РегистрБухгалтерииХозрасчетный.Очистить();
Движения.РегистрБухгалтерииХозрасчетный.Записать();
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Количество КАК КолДок,
| Товары.Сумма КАК СумДок,
| Товары.НомерСтроки,
| ЕСТЬNULL(РегистрУправленческийОстатки.СуммаОстатокДт, 0) КАК СумОст,
| ЕСТЬNULL(РегистрУправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст
|ИЗ
| (ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество) КАК Количество,
| СУММА(РеализацияТоваровТовары.Сумма) КАК Сумма,
| МАКСИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар)
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура) КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(
| &Момент,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары),
| ,
| Субконто1 В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТовары.Номенклатура
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Товар))) КАК РегистрУправленческийОстатки
| ПО Товары.Номенклатура = РегистрУправленческийОстатки.Субконто1”;
Запрос.УстановитьПараметр(“Момент”, МоментВремени());
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Нехватка = Выборка.КолДок – Выборка.КолОст;
Если Нехватка>0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Товара “+Выборка.Номенклатура+” не достаточно в количестве “+Нехватка;
Сообщение.Поле = “Товары[“+(Выборка.НомерСтроки-1)+”].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Себестоимость;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.Товары;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Товары] = Выборка.Номенклатура;
Проводка.КоличествоКт = Выборка.КолДок;
Если Выборка.КолОст<>0 Тогда
Проводка.Сумма = Выборка.СумОст*Выборка.КолДок/Выборка.КолОст;
Иначе
Проводка.Сумма = 0;
КонецЕсли;
КонецЦикла;
Если НЕ Отказ Тогда
Движения.РегистрБухгалтерииХозрасчетный.Записывать = Истина;
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Покупатели;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.Выручка;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
Проводка.Сумма = Товары.Итог(“Сумма”);
КонецЕсли;
КонецЕсли;
выписка
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
УУ = Истина;
БУ = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| &Контрагент КАК Контрагент,
| РегистрБухгалтерииРабочийОстатки.Счет КАК Счет,
| РегистрБухгалтерииРабочийОстатки.СуммаОстаток,
| ВЫБОР
| КОГДА РегистрБухгалтерииРабочийОстатки.СуммаОстаток > 0
| ТОГДА РегистрБухгалтерииРабочийОстатки.СуммаОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК Приход,
| ВЫБОР
| КОГДА РегистрБухгалтерииРабочийОстатки.СуммаОстаток < 0
| ТОГДА -РегистрБухгалтерииРабочийОстатки.СуммаОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК Расход
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(
| &Дата,
| Счет = &СчетПокупатели
| ИЛИ Счет = &СчетПоставщики,
| ,
| Субконто1 = &Контрагент) КАК РегистрБухгалтерииРабочийОстатки”;
Запрос.УстановитьПараметр(“Дата”, КонецДня(ТекущаяДата())+1);
Запрос.УстановитьПараметр(“Контрагент”, ДанныеЗаполнения);
Запрос.УстановитьПараметр(“СчетПокупатели”, ПланыСчетов.Хозрасчетный.Покупатели);
Запрос.УстановитьПараметр(“СчетПоставщики”, ПланыСчетов.Хозрасчетный.Поставщики);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Оплаты.Загрузить(Результат.Выгрузить());
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Акт сверки
&НаКлиенте
Процедура Заполнить(Команда)
// Вставить содержимое обработчика.
ЗаполнитьНаСервере();
ОбновитьИнтерфейс();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
Объект.Таблица.Очистить();
СчетПокупатели = ПланыСчетов.Хозрасчетный.Покупатели;
СчетПоставщики = ПланыСчетов.Хозрасчетный.Поставщики;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РегистрБухгалтерииРабочийОстаткиИОбороты.Период КАК Период,
| РегистрБухгалтерииРабочийОстаткиИОбороты.Регистратор КАК Документ,
| РегистрБухгалтерииРабочийОстаткиИОбороты.СуммаНачальныйОстаток КАК НачОстаток,
| РегистрБухгалтерииРабочийОстаткиИОбороты.СуммаКонечныйОстаток КАК КонОстаток,
| РегистрБухгалтерииРабочийОстаткиИОбороты.СуммаОборотКт КАК СуммаУменьшенияДолга,
| РегистрБухгалтерииРабочийОстаткиИОбороты.СуммаОборотДт КАК СуммаУвеличенияДолга
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.ОстаткиИОбороты(
| &НачДата,
| &КонДата,
| Регистратор,
| ,
| Счет = &СчетПокупатели
| ИЛИ Счет = &СчетПоставщики,
| ,
| Субконто1 = &Контрагент) КАК РегистрБухгалтерииРабочийОстаткиИОбороты
|
|УПОРЯДОЧИТЬ ПО
| Период”;
Запрос.УстановитьПараметр(“КонДата”, Объект.ДатаОкончания); //тут включая
Запрос.УстановитьПараметр(“Контрагент”, Объект.Контрагент);
Запрос.УстановитьПараметр(“НачДата”, Объект.ДатаНачала);
Запрос.УстановитьПараметр(“СчетПокупатели”, СчетПокупатели);
Запрос.УстановитьПараметр(“СчетПоставщики”, СчетПоставщики);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Объект.Таблица.Загрузить(Результат.Выгрузить());
КонецЕсли;
КонецПроцедуры
Задание выполнила.
Добавила во все документы реквизиты БУ, УУ – тип булево и в модуле объекта документов разнесла проведение в зависимости от установленных флагов.
В план счетов добавила признак Количественный, для счетов 62, 60 субконто Контрагенты.
В регистр бухгалтерии – новый ресурс Количество, не балансовый.
Добавила проведение по бух. регистру для документов.
Контроль остатков для РТУ:
<code> Результат = РаботаСДокументаСервер.ПолучитьДанныеПоТМЦДляСписания(Ссылка,МоментВремени()); //здесь получаются данные как в примере на видео
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Нехватка = Выборка.КолДок – Выборка.КолОст;
Если Нехватка > 0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Товара ” + Выборка.Номенклатура + ” недостаточно в количестве ” + Нехватка;
Сообщение.Поле = “Товары[“+(Выборка.НомерСтроки -1)+”]”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
Если Отказ = Истина Тогда
Продолжить;
КонецЕсли;
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.Активность = Истина;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Себестоимость;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.Товары;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Товары] = Выборка.Номенклатура;
Проводка.КоличествоКт = Выборка.КолДок;
Если Не Выборка.КолОст = 0 Тогда
Проводка.Сумма = ?(Нехватка = 0,Выборка.СуммаОст, Выборка.КолДок*Выборка.СуммаОст/Выборка.КолОст);
Иначе
КонецЕсли;
КонецЦикла;
Если не Отказ Тогда
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.Активность = Истина;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Покупатели;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.Выручка;
Проводка.Сумма = СуммаДокумента;
Движения.РегистрБухгалтерииХозрасчетный.Записывать = Истина;
КонецЕсли;
</code>
заполнение выписки
<code>Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
// Заполнение шапки
ЗаполнениеДокументовСервер.ЗаполнитьПоКонтрагентуВыписку(ДанныеЗаполнения, ЭтотОбъект);
КонецЕсли;
КонецПроцедуры
Процедура ЗаполнитьПоКонтрагентуВыписку(Контрагент, Документ) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РегистрБухгалтерииХозрасчетныйОстатки60.Субконто1 КАК Контрагент,
| РегистрБухгалтерииХозрасчетныйОстатки60.СуммаОстатокДт КАК Приход,
| РегистрБухгалтерииХозрасчетныйОстатки60.СуммаОстатокКт КАК Расход,
| РегистрБухгалтерииХозрасчетныйОстатки60.Счет КАК СчетРасчетов
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(&Момент, Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Поставщики), , Субконто1 = &Контрагент) КАК РегистрБухгалтерииХозрасчетныйОстатки60
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| РегистрБухгалтерииХозрасчетныйОстатки62.Субконто1,
| РегистрБухгалтерииХозрасчетныйОстатки62.СуммаОстатокДт,
| РегистрБухгалтерииХозрасчетныйОстатки62.СуммаОстатокКт,
| РегистрБухгалтерииХозрасчетныйОстатки62.Счет
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(&Момент, Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Покупатели), , Субконто1 = &Контрагент) КАК РегистрБухгалтерииХозрасчетныйОстатки62”;
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Запрос.УстановитьПараметр(“Момент”,ТекущаяДата());
Результат = Запрос.Выполнить().Выгрузить();
Документ.Оплаты.Загрузить(Результат);
КонецПроцедуры
</code>
для документа “Акт сверки” запрещено проведение, заполнение документа:
<code> &НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
ДокОбъект = РеквизитФормыВЗначение(“Объект”);
ТаблицаДанных = РаботаСДокументаСервер.ЗаполнитьАктСверки(Объект.Контрагент,Объект.ДатаНачала,Объект.ДатаКонца);
ДокОбъект.Взаиморасчеты.Загрузить(ТаблицаДанных);
Если ТаблицаДанных.количество()>0 Тогда
ДокОбъект.НачальныйОстаток = ТаблицаДанных[0].НачальныйОстаток;
Иначе
ДокОбъект.НачальныйОстаток = 0;
КонецЕсли;
ЗначениеВРеквизитФормы(ДокОбъект,”Объект”);
КонецПроцедуры
Функция ЗаполнитьАктСверки(Контрагент,ДатаНачала,ДатаКонца) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ВложенныйЗапрос.Документ,
| ВложенныйЗапрос.СуммаУвеличенияДолга,
| ВложенныйЗапрос.СуммаУменьшенияДолга,
| ВложенныйЗапрос.НачальныйОстаток
|ИЗ
| (ВЫБРАТЬ
| РегистрБухгалтерииХозрасчетныйОстаткиИОбороты60.Регистратор КАК Документ,
| РегистрБухгалтерииХозрасчетныйОстаткиИОбороты60.СуммаОборотДт КАК СуммаУвеличенияДолга,
| РегистрБухгалтерииХозрасчетныйОстаткиИОбороты60.СуммаОборотКт КАК СуммаУменьшенияДолга,
| РегистрБухгалтерииХозрасчетныйОстаткиИОбороты60.СуммаНачальныйОстаток КАК НачальныйОстаток
| ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.ОстаткиИОбороты(&ДатаНачала, &ДатаКонца, Регистратор, ДвиженияИГраницыПериода, Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Поставщики), , Субконто1 = &Контрагент) КАК РегистрБухгалтерииХозрасчетныйОстаткиИОбороты60
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| РегистрБухгалтерииХозрасчетныйОстаткиИОбороты62.Регистратор,
| РегистрБухгалтерииХозрасчетныйОстаткиИОбороты62.СуммаОборотДт,
| РегистрБухгалтерииХозрасчетныйОстаткиИОбороты62.СуммаОборотКт,
| РегистрБухгалтерииХозрасчетныйОстаткиИОбороты62.СуммаНачальныйОстаток
| ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.ОстаткиИОбороты(&ДатаНачала, &ДатаКонца, Регистратор, ДвиженияИГраницыПериода, Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Покупатели), , Субконто1 = &Контрагент) КАК РегистрБухгалтерииХозрасчетныйОстаткиИОбороты62) КАК ВложенныйЗапрос
|
|УПОРЯДОЧИТЬ ПО
| ВложенныйЗапрос.Документ.Дата”;
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Запрос.УстановитьПараметр(“ДатаНачала”,НачалоДня(ДатаНачала));
Запрос.УстановитьПараметр(“ДатаКонца”,КонецДня(ДатаКонца));
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
</code>
начальный остаток фиксируется в момент заполнения, конечный остаток при печати расчетный.
Задание выполнено. Добавлены признаки УУ и БУ в документы – движения создаются исходя их этих настроек. При проведении учитывается вид номенклатуры. Добавлена аналитика “Контрагенты” на счета 60 и 62 – заполняется в соответствующих документах. Добавлен количественный учет по товарным счетам. При списании производится расчет себестоимости по средневзвешенной. Создан документ Выписка с табличной частью, где указываются Контрагент, Счет, Сумма. Документ формирует проводки и вводится на основании контрагента. Над заполнением еще подумаю, думаю можно сделать оптимальнее. Создан Акт сверки взаиморасчетов – тоже простого заполнения пока не придумал, делал сложный запрос. Добавлена печатная форма.
Всем доброго времени суток.
Представляю отчёт по одиннадцатому домашнему заданию.
Во всех документах (кроме АктаСверкиВзаиморасчетов, т.к. он не формирует движений) создал реквизиты булевского типа ОтражатьВУправленческомУчете и ОтражатьВБухгалтерскомУчете.
Для документа КонтактСКлиентом флаг БУ сделал недоступным, т.к. движения формируются только в регистре сведений МенеджерыКонтрагентов. Спустя некоторое время, надоело в ручную устанавливать флаги в документах и решил дополнить процедуры модулей форм соответствующих объектов следующим кодом:
<code>
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДокОбъект = РеквизитФормыВЗначение(“Объект”);
Если ДокОбъект.ЭтоНовый() Тогда
ДокОбъект.ОтражатьВУправленческомУчете = Истина;
ДокОбъект.ОтражатьВБухгалтерскомУчете = Истина;
ЗначениеВРеквизитФормы(ДокОбъект, “Объект”);
КонецЕсли;
КонецПроцедуры
</code>
Все новые документы стали создаваться с уже установленными флагами, которые при необходимости можно снять (исключение – документ Операция, там я по умолчанию установил только флаг БУ, т.к. документ в принципе не для управленческого учёта создавался).
В процедурах проведения документов, перед формированием движений по соответсвующим регистрам, добавил простую проверку на установленный флаг, если истина – движения формируются. (все движения формируются в модулях объектов, вынесение в общие модули по примеру решений домашних заданий я делать не стал).
В ПВХ ВидыСубконто добавил предопределённый элемент – Контрагент, в плане счетов Управленческий на 60 и 62 счёте добавил соответствующие виды субконто.
Доработал процедуру проведения документа ПоступлениеТоваров. В части кода по формированию движений в регистр бухгалтерии Управленческий, с предыдущего задания осталась пустая ветка проверки условия на Товар/Услуга, проводку по товарам уже делали, сейчас дописал в в эту ветку проводку в соответствии с заданием. Привожу частичный листинг процедуры ОбработкаПроведения модуля объекта документа ПоступлениеТоваров:
<code>
Если ОтражатьВБухгалтерскомУчете Тогда
//Движение по регистру бухгалтерии Управленческий
Если ЭтоНабор = Перечисления.ВидыНоменклатуры.Услуга Тогда
Проводка = Движения.Управленческий.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Управленческий.Затраты;
Проводка.СчетКт = ПланыСчетов.Управленческий.Поставщики;
Проводка.СубконтоКт.Контрагент = Контрагент;
Проводка.Сумма = ТекСтрока.Сумма;
Иначе
Проводка = Движения.Управленческий.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Управленческий.Товары;
Проводка.СубконтоДт.Номенклатура = ТекСтрока.Номенклатура;
Проводка.КоличествоДт = ТекСтрока.Количество;
Проводка.СчетКт = ПланыСчетов.Управленческий.Поставщики;
Проводка.СубконтоКт.Контрагент = Контрагент;
Проводка.Сумма = ТекСтрока.Сумма;
КонецЕсли;
КонецЕсли;
</code>
Далее – списание стоимости ТМЦ и формирование проводок по взаиморасчётам с покупателями.
Тут всё практически в соответствии с материалами уроков сделано. Единственное, когда я начал проверять, у меня система начала ругаться на нехватку остатков реализованных услуг. На остатке им пока появиться неоткуда, поэтому я вынес проведение строк ТЧ документа с услугами за пределы проверки остатков и добавил проводку по взаиморасчётам на всю сумму Дт 62 – Кт 90.01
Да, ещё при определении суммы списания товаров добавил проверку условия на “зависшие” копейки, про которые спрашивал выше. Привожу листинг процедуры модуля объекта документа РеализацияТоваров:
<code>
Процедура ОбработкаПроведения(Отказ, Режим)
ПроведениеПоОперативномуУчету(Отказ, Режим);
Движения.Управленческий.Очистить();
Движения.Управленческий.Записать();
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Количество КАК КолДок,
| Товары.Сумма КАК СумДок,
| Товары.НомерСтроки,
| ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СумОст,
| ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст
|ИЗ
| (ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество) КАК Количество,
| СУММА(РеализацияТоваровТовары.Сумма) КАК Сумма,
| МАКСИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура) КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки(
| &Момент,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары),
| ,
| Субконто1 В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТовары.Номенклатура
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка)) КАК УправленческийОстатки
| ПО Товары.Номенклатура = УправленческийОстатки.Субконто1”;
Запрос.УстановитьПараметр(“Момент”, Новый Граница(МоментВремени(), ВидГраницы.Включая));
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
// Проводка взаиморасчетов
Проводка = Движения.Управленческий.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Управленческий.Покупатели;
Проводка.СубконтоДт.Контрагент = Контрагент;
Проводка.СчетКт = ПланыСчетов.Управленческий.Выручка;
Проводка.Сумма = Выборка.СумДок
Иначе
Нехватка = Выборка.КолДок – Выборка.КолОст;
Если Нехватка > 0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Товара ” + Выборка.Номенклатура + ” не хватает в количестве ” + Нехватка;
Сообщение.Поле = “Товары[” + (Выборка.НомерСтроки – 1) + “].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
Продолжить;
КонецЕсли;
//Движения по регистру бухгалтерии Управленческий
// Проводка списания Товаров
Проводка = Движения.Управленческий.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Управленческий.Себестоимость;
Проводка.СчетКт = ПланыСчетов.Управленческий.Товары;
Проводка.СубконтоКт.Номенклатура = Выборка.Номенклатура;
Проводка.КоличествоКт = Выборка.КолДок;
Если Выборка.КолОст = Выборка.КолДок Тогда
Проводка.Сумма = Выборка.СумОст;
ИначеЕсли Выборка.КолОст = 0 Тогда
Проводка.Сумма = 0;
Иначе
Проводка.Сумма = Выборка.СумОст * Выборка.КолДок / Выборка.КолОст;
КонецЕсли;
// Проводка взаиморасчетов
Проводка = Движения.Управленческий.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Управленческий.Покупатели;
Проводка.СубконтоДт.Контрагент = Контрагент;
Проводка.СчетКт = ПланыСчетов.Управленческий.Выручка;
Проводка.Сумма = Выборка.СумДок;
КонецЕсли;
КонецЦикла;
Движения.Управленческий.Записать();
КонецПроцедуры
</code>
В табличную часть документа Выписка добавил реквизит СчетРасчетов с типом ПланСчетовСсылка.Управленческий. В процедуру ОбработкаПроведения, кроме самих движений по документу добавил небольшую проверку на введённый счёт (чтоб пользователь случайно не поставил счёт отличный от 60 или 62). Привожу листинг модуля объекта документа Выписка:
<code>
Процедура ОбработкаПроведения(Отказ, Режим)
Для каждого Строчка Из Взаиморасчеты Цикл
Счет = Строчка.СчетРасчетов;
Если НЕ (Счет = ПланыСчетов.Управленческий.Покупатели
ИЛИ Счет = ПланыСчетов.Управленческий.Поставщики) Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Счет – ” + Счет + ” указан неверно!”;
Сообщение.Поле = “Взаиморасчеты[” + (Строчка.НомерСтроки – 1) + “].СчетРасчетов”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
КонецЦикла;
Движения.Взаиморасчеты.Записывать = Истина;
Для Каждого ТекСтрокаВзаиморасчеты Из Взаиморасчеты Цикл
Если ОтражатьВУправленческомУчете Тогда
// Проведение по регистру взаиморасчетов
Если ТекСтрокаВзаиморасчеты.Поступило > 0 Тогда
Движение = Движения.Взаиморасчеты.ДобавитьРасход();
Движение.Период = Дата;
Движение.Контрагент = ТекСтрокаВзаиморасчеты.Контрагент;
Движение.ДолгКонтрагента = ТекСтрокаВзаиморасчеты.Поступило;
КонецЕсли;
Если ТекСтрокаВзаиморасчеты.Перечислено > 0 Тогда
Движение = Движения.Взаиморасчеты.ДобавитьПриход();
Движение.Период = Дата;
Движение.Контрагент = ТекСтрокаВзаиморасчеты.Контрагент;
Движение.ДолгКонтрагента = ТекСтрокаВзаиморасчеты.Перечислено;
КонецЕсли;
КонецЕсли;
Если ОтражатьВБухгалтерскомУчете Тогда
//Движения по регистру бухгалтерии Управленческий
Если ТекСтрокаВзаиморасчеты.Поступило > 0 Тогда
Проводка = Движения.Управленческий.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Управленческий.Банк;
Проводка.СчетКт = ?(ТекСтрокаВзаиморасчеты.СчетРасчетов = ПланыСчетов.Управленческий.Покупатели,
ПланыСчетов.Управленческий.Покупатели, ПланыСчетов.Управленческий.Поставщики);
Проводка.СубконтоКт.Контрагент = ТекСтрокаВзаиморасчеты.Контрагент;
Проводка.Сумма = ТекСтрокаВзаиморасчеты.Поступило;
КонецЕсли;
Если ТекСтрокаВзаиморасчеты.Перечислено > 0 Тогда
Проводка = Движения.Управленческий.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ?(ТекСтрокаВзаиморасчеты.СчетРасчетов = ПланыСчетов.Управленческий.Покупатели,
ПланыСчетов.Управленческий.Покупатели, ПланыСчетов.Управленческий.Поставщики);
Проводка.СубконтоДт.Контрагент = ТекСтрокаВзаиморасчеты.Контрагент;
Проводка.СчетКт = ПланыСчетов.Управленческий.Банк;
Проводка.Сумма = ТекСтрокаВзаиморасчеты.Перечислено;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Движения.Управленческий.Записать();
КонецПроцедуры
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| УправленческийОстатки.Счет,
| СУММА(УправленческийОстатки.СуммаОстаток) КАК Сумма
|ИЗ
| РегистрБухгалтерии.Управленческий.Остатки(
| &Момент,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели)
| ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Поставщики),
| ,
| Субконто1 = &Контрагент) КАК УправленческийОстатки
|
|СГРУППИРОВАТЬ ПО
| УправленческийОстатки.Счет”;
Запрос.УстановитьПараметр(“Контрагент”, ДанныеЗаполнения);
Граница = Новый Граница(ОбщиеФункцииСервер.ПолучитьДату(), ВидГраницы.Включая);
Запрос.УстановитьПараметр(“Момент”, Граница);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Счет = ПланыСчетов.Управленческий.Поставщики И Выборка.Сумма < 0 Тогда
Запись = Взаиморасчеты.Добавить();
Запись.Контрагент = ДанныеЗаполнения;
Запись.СчетРасчетов = Выборка.Счет;
Запись.Перечислено = -Выборка.Сумма;
ИначеЕсли Выборка.Счет = ПланыСчетов.Управленческий.Покупатели И Выборка.Сумма > 0 Тогда
Запись = Взаиморасчеты.Добавить();
Запись.Контрагент = ДанныеЗаполнения;
Запись.СчетРасчетов = Выборка.Счет;
Запись.Поступило = Выборка.Сумма;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
</code>
Здесь сразу и следующая часть задания, про ввод на основании. Из виртуальной таблицы Остатки регистра бухгалтерии делаю выборку по счетам Поставщики и Покупатели в которых значение субконто равно контрагенту, на основании которого создаётся документ. Потом анализирую счёт и сумму остатка, по результатам – добавляю строки в ТЧ документа и делаю соответсвующие записи.
В заключении – документ АктСверкиВзаиморасчетов. Для документа сразу запретил проведение. В форму документа, кроме указанных реквизитов добавил ОстатокНаНачало и ОстатокНаКонец, которые всё равно нужны были для печатной формы. По сути эти два реквизита и помогли мне окончательно разобраться с условием формирования табличной части, как оказалось – в начале немного запутался.
Про печатную форму много рассказывать не буду – формировал с помощью конструктора, проблем не возникло. Выборку данных производил из виртуальной таблицы ОстаткиИОбороты регистра бухгалтерии. Привожу листинг модуля объекта документа АктСверкиВзаиморасчетов:
<code>
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
Объект.Взаиморасчеты.Очистить();
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ЕСТЬNULL(УправленческийОстаткиИОбороты.СуммаНачальныйОстаток, 0) КАК СуммаНачальныйОстаток,
| ЕСТЬNULL(УправленческийОстаткиИОбороты.СуммаОборотДт, 0) КАК СуммаОборотДт,
| ЕСТЬNULL(УправленческийОстаткиИОбороты.СуммаОборотКт, 0) КАК СуммаОборотКт,
| УправленческийОстаткиИОбороты.Регистратор КАК Регистратор,
| УправленческийОстаткиИОбороты.Счет
|ИЗ
| РегистрБухгалтерии.Управленческий.ОстаткиИОбороты(
| &ДатаНачала,
| &ДатаОкончания,
| Регистратор,
| ДвиженияИГраницыПериода,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Поставщики)
| ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели),
| ,
| Субконто1 = &Контрагент) КАК УправленческийОстаткиИОбороты
|
|УПОРЯДОЧИТЬ ПО
| УправленческийОстаткиИОбороты.Период,
| Регистратор”;
Запрос.УстановитьПараметр(“ДатаНачала”, Объект.НачалоПериода);
Запрос.УстановитьПараметр(“ДатаОкончания”, КонецДня(Объект.ОкончаниеПериода));
Запрос.УстановитьПараметр(“Контрагент”, Объект.Контрагент);
Результат = Запрос.Выполнить();
ОстатокНаНачало = Результат.Выгрузить()[0].СуммаНачальныйОстаток;
ОстатокНаКонец = ОстатокНаНачало;
Счет60 = ПланыСчетов.Управленческий.Поставщики;
Счет62 = ПланыСчетов.Управленческий.Покупатели;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Если Выборка.Счет = Счет60 Тогда
Если Выборка.СуммаОборотДт > 0 Тогда
Запись = Объект.Взаиморасчеты.Добавить();
Запись.Документ = Выборка.Регистратор;
Запись.СуммаУвеличенияДолга = Выборка.СуммаОборотДт;
ОстатокНаКонец = ОстатокНаКонец + Выборка.СуммаОборотДт;
ИначеЕсли Выборка.СуммаОборотКт > 0 Тогда
Запись = Объект.Взаиморасчеты.Добавить();
Запись.Документ = Выборка.Регистратор;
Запись.СуммаУменьшенияДолга = Выборка.СуммаОборотКт;
ОстатокНаКонец = ОстатокНаКонец – Выборка.СуммаОборотКт;
КонецЕсли;
КонецЕсли;
Если Выборка.Счет = Счет62 Тогда
Если Выборка.СуммаОборотДт > 0 Тогда
Запись = Объект.Взаиморасчеты.Добавить();
Запись.Документ = Выборка.Регистратор;
Запись.СуммаУвеличенияДолга = Выборка.СуммаОборотДт;
ОстатокНаКонец = ОстатокНаКонец + Выборка.СуммаОборотДт;
ИначеЕсли Выборка.СуммаОборотКт > 0 Тогда
Запись = Объект.Взаиморасчеты.Добавить();
Запись.Документ = Выборка.Регистратор;
Запись.СуммаУменьшенияДолга = Выборка.СуммаОборотКт;
ОстатокНаКонец = ОстатокНаКонец – Выборка.СуммаОборотКт;
КонецЕсли;
КонецЕсли;
КонецЦикла;
Объект.ОстатокНаНачало = ОстатокНаНачало;
Объект.ОстатокНаКонец = ОстатокНаКонец;
КонецПроцедуры // ЗаполнитьНаСервере(Объект.НачалоПериода, Объект.ОкончаниеПериода, Объект.Контрагент)
</code>
Евгений, при формировании печатной формы задумался над отображением времени документа, который является регистратором для операции. Не очень красиво выглядит результат, считаю, что даты документа было бы достаточно. Есть ли способ убрать время документа при формировании табличной части Акта сверки? Если не в двух словах – можно в мастер-группу ))
Чтобы убрать время можно воспользоваться функцией глобального контекста Формат.
Ага, я ничего не понял )) К какому месту прикручивать Формат? В процедуре печати смотрел – там вообще табличная часть через заполнение параметров выполняется. В запрос вроде тоже пристроиться никак. Остаётся только реквизит Документ табличной части. Свойство Формат данного реквизита нужного результата не даёт, что вполне логично.
Встроенные функции языка (Script functions)
Формат (Format)
из синтакс-помощника распространяется только на примитивные типы данных, на ссылку вроде не должно распространяться.
Изначально я думал, что речь идет о дате документа.
Конечно же Формат не применить к ссылке. Для ссылки нужно вручную переопределять представление, то есть написать функцию, которая вернет строку вида [ВидДокумента] № [Номер] от [Дата].
И делать это придется не в запросе, а после его выполнения.
Заполнять параметр нужно будет также вручную:
ТабДок.Параметры.Ссылка = РаботаСДокументами.ПолучитьПредставлениеДокумента(Выборка.Ссылка);
Задание выполнил.
Анализ состояния флагов УУ и БУ разместил в обработках проведения.
Учет услуг Дт 26 Кт 60, и аналитический учет взаиморасчетов с покупателями и поставщиками в разрезе контрагентов реализхован доработкой запроса в функции ПолучитьДанныеПоТМЦДокумента(Ссылка, Дата, КорСчет).
При этом использовал конструкции содержащие оператор выбора типа приведенной ниже:
<code>
ВЫБОР
КОГДА ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
ТОГДА ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
ИНАЧЕ ДокТовары.Номенклатура
КОНЕЦ
</code>
Списание товаров осуществляем по старому методу:
запросом определяем остатки по РегистрБухгалтерииХозрасчетныйОстатки,
вычисляем нехватку,
если она больше нуля отказ и сообщение пользователю,
иначе записываем проводки.
Ввод на основании контрагента документа “Выписка”, определение долга и разнос сумм
прихода и расхода по соответствующим колонкам реализован в процедуре ОбработкаЗаполнения модуля объекта документа.
Необходимые данные получаем с помощью запроса к РегистрБухгалтерииХозрасчетныйОстатки с последующей выгрузкой результата в таблицу документа.
В документ “Акт сверки взаиморасчетов” кроме указанных в задании добавлены скрытые реквизиты ДолгНаНачало и ДолгНаОкончание.
Далее запросом к РегистрБухгалтерииХозрасчетныйДвиженияССубконто получаем данные для заполнения таблицы и к РегистрБухгалтерииХозрасчетныйОстатки долги на начало и конец периода.
Печатную форму сформиролвал с помощью конструктора печати.
Добавила флаги в документы БУ, УУ. В процедурах проведения разделение идет с помощью Если УУ и Если БУ. Организовала аналитический учет по контрагентам и количественный учет по товарам. Поступление товаров делает проводку Дт26 Кт60 без аналитики. Выбирается табличная часть документа одним запросом с использованием Выбор Когда для Дт. Списание товаров среднескользящей реализовано как показано в уроках. документ Выписка формирует проводки Дт 51 Кт 62 и Дт 60 Кт 51 с аналитикой по контрагентам. Суммы по контрагентам выбираются запросом из регистра бухгалтерии Остатки на дату документа включая. создала документ Акт сверки. Данные для заполнения формируются запросом, источник регистр бухгалтерии ДвиженияССубконто. Печатная форма создана при помощи конструктора.
Беспощадно жму Отчеты (получаются большие), вот где то в конце тег code пропустил, вы уж не обессудьте Евгений.
Все ОК.
ДЗ №11
В нужные документы добавил реквизиты ОтразитьВУУ, ОтразитьВБУ. В МО документов в событии ОбработкаПроведения() прежде принудительно чищу движения вызывая процедуру из общего модуля РаботаСДокументамиСервер.ОчисткаКоллекцииДвиженийДокумента(ЭтотОбъект);
Формирую записи по регистрам в зависимости от флагов УУ и БУ.
Добавил требуемые субконто на сч 60 и 62. Доработал Запрос для отражения Услуг и Субконто по счету 60 и в функции РаботаСДокументамиСервер. ПолучитьДанныеПоТМЦДокумента(Ссылка, Дата, КорСчет), добавил к запросу:
<code> |…
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| &Период,
| НЕОПРЕДЕЛЕНО,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка),
| &Счет,
| &КорСчет,
| ДокТовары.Ссылка.Контрагент,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты),
| СУММА(ДокТовары.Сумма),
| СУММА(ДокТовары.Количество)
|ИЗ
| &ДокументТовары КАК ДокТовары
|ГДЕ
| ДокТовары.Ссылка = &Ссылка
| И ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
|
|СГРУППИРОВАТЬ ПО
| ДокТовары.Номенклатура,
| ДокТовары.Ссылка.Контрагент”; </code>
Функция РаботаСДокументамиСервер. ПолучитьДанныеПоТМЦДокумента(Ссылка, Дата, КорСчет) формирует наборы записей для док. Поступление и АвансовыйОтчет, для АвансовогоОтчета скопировал данную функцию в Модуль Менеджера (ММ) и вызываю в МО из ММ – что бы излишне Запрос не усложнять, и все подготовительную работу по проведению документа не выносить в Общие модули, а хранить в самом документе.
Добавил в план счетов признак Количественный, назначил его для ресурса Количество Регистра бухгалтерии. Доработал МО док. «Расходная накладная», для списания ТМЦ по средне скользящей по данным регистра бухгалтерии и отражения выручки как в уроках Глава 8. Все получилось.
Доработал док. «Выписка». На реквизит табличной части «СчетаРасчетовСКонтрагентом» наложил отбор в фиксированном массиве (счета 60 и 62). В МО получилось вот так:
<code> Процедура ПроведениеПоБухгалтерскомуУчету()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| &Период,
| ВЫБОР
| КОГДА ВыпискаПлатежи.Приход > 0
| ТОГДА &СчетБанк
| ИНАЧЕ ВыпискаПлатежи.СчетРасчетовСКонтрагентом
| КОНЕЦ КАК СчетДт,
| ВЫБОР
| КОГДА ВыпискаПлатежи.Приход > 0
| ТОГДА НЕОПРЕДЕЛЕНО
| ИНАЧЕ ВыпискаПлатежи.Контрагент
| КОНЕЦ КАК СубконтоДт1,
| ВЫБОР
| КОГДА ВыпискаПлатежи.Приход > 0
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты)
| КОНЕЦ КАК ВидСубконтоДт1,
… аналогично для стороны Кредита
| ВЫБОР
| КОГДА ВыпискаПлатежи.Приход > 0
| ТОГДА ВыпискаПлатежи.Приход
| ИНАЧЕ ВыпискаПлатежи.Расход
| КОНЕЦ КАК Сумма
|ИЗ
| Документ.Выписка.Платежи КАК ВыпискаПлатежи”;
Запрос.УстановитьПараметр(“Период”, …
Результат = Запрос.Выполнить();
Движения.РегистрУправленческий.Загрузить(Результат.Выгрузить());
КонецПроцедуры </code>
Вввод на основании Контрагента с заполнением, реализовал так:
<code>Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| &Контрагент,
| РегистрУправленческийОстатки.Счет КАК СчетРасчетовСКонтрагентом,
| ВЫБОР
| КОГДА РегистрУправленческийОстатки.СуммаОстаток > 0
| ТОГДА РегистрУправленческийОстатки.СуммаОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК Приход,
| ВЫБОР
| КОГДА РегистрУправленческийОстатки.СуммаОстаток < 0
| ТОГДА -РегистрУправленческийОстатки.СуммаОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК Расход
|ИЗ
| РегистрБухгалтерии.РегистрУправленческий.Остатки(, , ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты), Субконто1 = &Контрагент) КАК РегистрУправленческийОстатки”;
Запрос.УстановитьПараметр(“Контрагент”, ДанныеЗаполнения);
Результат = Запрос.Выполнить();
Платежи.Загрузить(Результат.Выгрузить());
КонецЕсли;
КонецПроцедуры</code>
Создал док. «Акт сверки», табличная часть ПоДаннымОрганизации (Дата, Документ, Дебет, Кредит), по кнопке «Заполнить» вызываю процедуру из МФ и передаю управление на сервер.
Выбираю Запросом ИЗ
<code> |ИЗ
| РегистрБухгалтерии.РегистрУправленческий.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, , ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты), Субконто1 = &Контрагент, , ) КАК РегистрУправленческийОбороты < /code >
Группирую по Регистратору и Периоду, сортирую по Дата
Устанавливаю параметры и выгружаю результат
<code>Запрос.УстановитьПараметр(“ДатаНачала”, Новый Граница (Объект.ДатаНачала, ВидГраницы.Исключая));
Запрос.УстановитьПараметр(“ДатаОкончания”, Новый Граница (Объект.ДатаОкончания, ВидГраницы.Включая));
Запрос.УстановитьПараметр(“Контрагент”, Объект.Контрагент);
Результат = Запрос.Выполнить();
Объект.ПоДаннымОрганизации.Загрузить(Результат.Выгрузить());</code>
Печатную форму изготовил конструктором, добавил Остатки, которые извлек вот таким Запросом
<code>Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| УправленческийОстаткиНаНачало.СуммаОстаток КАК ОстатокНаНачало,
| 0 КАК ОстатокНаКонец
|ИЗ
| РегистрБухгалтерии.РегистрУправленческий.Остатки(&ДатаНачала, , ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты), Субконто1 = &Контрагент) КАК УправленческийОстаткиНаНачало
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 0,
| ХозрасчетныйОстаткиНаНачало.СуммаОстаток
|ИЗ
| РегистрБухгалтерии.РегистрУправленческий.Остатки(&ДатаОкончания, , ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты), Субконто1 = &Контрагент) КАК ХозрасчетныйОстаткиНаНачало
|ИТОГИ
| СУММА(ОстатокНаНачало),
| СУММА(ОстатокНаКонец)
|ПО
| ОБЩИЕ”;
Запрос.УстановитьПараметр(“ДатаНачала”, Новый Граница (Ссылка[0].ДатаНачала,ВидГраницы.Исключая));
Запрос.УстановитьПараметр(“ДатаОкончания”, Новый Граница (Ссылка[0].ДатаОкончания,ВидГраницы.Включая));
Запрос.УстановитьПараметр(“Контрагент”, Ссылка[0].Контрагент);
Выборка = Запрос.Выполнить().Выбрать(ОбходРезультатаЗапроса.ПоГруппировкам, “ОБЩИЕ”);
Выборка.Следующий();
ОстатокНаНачало = Выборка.ОстатокНаНачало;
ОстатокНаКонец = Выборка.ОстатокНаКонец; </code>
ВСЕ.
Задание выполнено.
В док-ты добавлены реквизиты УУ, БУ. В общих модулях в процедурах проведения по БУ или УУ добавлен параметр (УУ/БУ):
ДвиженияПоРегистрамСервер.ДвиженияПоБУ(Движения,РезультатПоТМЦиУслугам,БУ);
Для учета услуг в проводках по БУ док-та Поступления в процедуре ПолучитьДанныеПоТМЦиУслугам(ссылка, Дата,СчетКт) изменен запрос, в запрос через “объединить все” добавлен запрос про услуги. ВидСубконто и Субконто выведены в параметры запроса. В зависимости от Счета Кт видСубконто и Субконто меняются.
В нужные счета добавлен количественный учет и субконто “Контрагент”. Скорректированы проводки по док-там ТМЦ согласно уроку(лекции).
Скорректирован док-т Выписка и добавлены проводки по БУ. Сделан ввод на основании справочник Контагенты док-та Выписка запросом к виртуальной таблице Остатки объединением 2 запросов по счетам 60 и 62, по 62 остатокДт, по 60 остатокКт.
Создан док-т АктСверкиВзаиморасчетов. Для заполнения ТЧ делается запрос к виртуальной таблице Обороты по счетам 60 и 62 с периодичностью Регистратор, СуммаОборот Дт как СуммаУвеличенияДолга и СуммаОборотКт КАК СуммаУменьшенияДолга.
Для вывода печатной формы для отражения долга Контрагента на начало и конец Периода сделан доп запрос к таблице Остатки. Вывод печ формы сделан Конструктором в Модуле Менеджера.
Задание выполнил.
Создал реквизиты булевского типа для проведения по видам учета в документах.
Проверяю при проведении эти флаги и чищу движения в нужных регистрах.
Получившаяся процедура проведения Расходной:
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если ПроводитьСОшибками=ИСТИНА Тогда
БезКонтроля=ИСТИНА;
Иначе
ТекПользователь=ОбщиеФункцииСервер.ТекущийПользовательВСпрПользователи();
Если ЗначениеЗаполнено(ТекПользователь) Тогда
БезКонтроля=ТекПользователь.ПринудительноеПроведениеОтгрузки;
Иначе
БезКонтроля=ЛОЖЬ;
КонецЕсли;
КонецЕсли;
Если не УУ Тогда
//Чистим движения по УУ
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.ОстаткиНоменклатуры.Записать();
Движения.ПродажиНоменклатуры.Записывать=Истина;
Движения.ПродажиНоменклатуры.Записать();
Движения.ВзаиморасчетыСКонтрагентами.Записывать=Истина;
Движения.ВзаиморасчетыСКонтрагентами.Записать();
Иначе
//Делаем без проверки движения по остаткам номенклатуры
ТабОстатков=ОбщиеРаботаСДокументами.СозданиеТаблицыСписанияНоменклатурыСКомплектами(Ссылка,Дата,ВидДвиженияНакопления.Расход);
Если ТабОстатков.Количество()>0 Тогда
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.ОстаткиНоменклатуры.Загрузить(ТабОстатков);
Движения.ОстаткиНоменклатуры.Записать();
//Делаем проверку остатков номенклатуры
Запрос2 = Новый Запрос;
Запрос2.Текст =
“ВЫБРАТЬ
| СУММА(ЕСТЬNULL(Тов.Количество, 0)) КАК КолДок,
| СУММА(ЕСТЬNULL(ОстаткиНоменклатурыОстатки.КоличествоОстаток, 0)) КАК КолОст,
| ОстаткиНоменклатурыОстатки.Номенклатура,
| ОстаткиНоменклатурыОстатки.КачествоТовара,
| МИНИМУМ(Тов.НомерСтроки) КАК НомерСтроки
|ИЗ
| (ВЫБРАТЬ
| Тов.Номенклатура КАК Номенклатура,
| Тов.КачествоТовара КАК КачествоТовара,
| СУММА(Тов.Количество) КАК Количество,
| МИНИМУМ(Тов.НомерСтроки) КАК НомерСтроки
| ИЗ
| (ВЫБРАТЬ
| ЕСТЬNULL(РеализацияТовараСоставНаборов.Комплектующее, РеализацияТовараТовары.Товар) КАК Номенклатура,
| РеализацияТовараТовары.КачествоТовара КАК КачествоТовара,
| СУММА(ЕСТЬNULL(РеализацияТовараСоставНаборов.Количество, 1) * РеализацияТовараТовары.К * РеализацияТовараТовары.Количество) КАК Количество,
| МИНИМУМ(РеализацияТовараТовары.НомерСтроки) КАК НомерСтроки
| ИЗ
| Документ.РеализацияТовара.Товары КАК РеализацияТовараТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТовара.СоставНаборов КАК РеализацияТовараСоставНаборов
| ПО РеализацияТовараТовары.Товар = РеализацияТовараСоставНаборов.Набор
| ГДЕ
| РеализацияТовараСоставНаборов.Ссылка = &Ссылка
| И РеализацияТовараТовары.Ссылка = &Ссылка
| И РеализацияТовараТовары.Товар.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Набор)
|
| СГРУППИРОВАТЬ ПО
| РеализацияТовараТовары.КачествоТовара,
| ЕСТЬNULL(РеализацияТовараСоставНаборов.Комплектующее, РеализацияТовараТовары.Товар)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| РеализацияТовараТовары.Товар,
| РеализацияТовараТовары.КачествоТовара,
| СУММА(РеализацияТовараТовары.Количество * РеализацияТовараТовары.К),
| МИНИМУМ(РеализацияТовараТовары.НомерСтроки)
| ИЗ
| Документ.РеализацияТовара.Товары КАК РеализацияТовараТовары
| ГДЕ
| РеализацияТовараТовары.Ссылка = &Ссылка
| И РеализацияТовараТовары.Товар.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)
|
| СГРУППИРОВАТЬ ПО
| РеализацияТовараТовары.Товар,
| РеализацияТовараТовары.КачествоТовара) КАК Тов
|
| СГРУППИРОВАТЬ ПО
| Тов.КачествоТовара,
| Тов.Номенклатура) КАК Тов
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(
| &МоментВремени,
| (Номенклатура, КачествоТовара) В
| (ВЫБРАТЬ
| РеализацияТовараТовары.Товар КАК Номенклатура,
| РеализацияТовараТовары.КачествоТовара
| ИЗ
| Документ.РеализацияТовара.Товары КАК РеализацияТовараТовары
| ГДЕ
| РеализацияТовараТовары.Ссылка = &Ссылка
| И РеализацияТовараТовары.Товар.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| РеализацияТовараСоставНаборов.Комплектующее,
| РеализацияТовараТовары.КачествоТовара
| ИЗ
| Документ.РеализацияТовара.Товары КАК РеализацияТовараТовары ВНУТРЕННЕЕ СОЕДИНЕНИЕ Документ.РеализацияТовара.СоставНаборов КАК РеализацияТовараСоставНаборов
| ПО
| РеализацияТовараТовары.Товар = РеализацияТовараСоставНаборов.Набор
| ГДЕ
| РеализацияТовараСоставНаборов.Ссылка = &Ссылка
| И РеализацияТовараТовары.Ссылка = &Ссылка
| И РеализацияТовараТовары.Товар.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Набор))) КАК ОстаткиНоменклатурыОстатки
| ПО Тов.КачествоТовара = ОстаткиНоменклатурыОстатки.КачествоТовара
| И Тов.Номенклатура = ОстаткиНоменклатурыОстатки.Номенклатура
|ГДЕ
| ОстаткиНоменклатурыОстатки.КоличествоОстаток < 0
|
|СГРУППИРОВАТЬ ПО
| ОстаткиНоменклатурыОстатки.Номенклатура,
| ОстаткиНоменклатурыОстатки.КачествоТовара”;
Запрос2.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос2.УстановитьПараметр(“МоментВремени”,Новый Граница(МоментВремени(),ВидГраницы.Включая));
Результат2 = Запрос2.Выполнить();
Если НЕ Результат2.Пустой() Тогда
Если НЕ БезКонтроля Тогда
Отказ=Истина;
КонецЕсли;
Выборка2 = Результат2.Выбрать();
Пока Выборка2.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “УУ: ТОВАР: “+Выборка2.Номенклатура+”, КАЧЕСТВО: “+Выборка2.КачествоТовара+” не хватает “+(-Выборка2.КолОст)+” из “+Выборка2.КолДок;
Сообщение.Поле = “Товары[“+(Выборка2.НомерСтроки-1)+”].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЦикла;
КонецЕсли;
КонецЕсли;
Если НЕ Отказ Тогда
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РеализацияТовараТовары.Товар КАК Номенклатура,
| СУММА(РеализацияТовараТовары.Количество * РеализацияТовараТовары.К) КАК Количество,
| СУММА(РеализацияТовараТовары.Сумма) КАК Сумма,
| РеализацияТовараТовары.Ссылка.Менеджер,
| РеализацияТовараТовары.Ссылка.Контрагент,
| &ДатаДок КАК Период
|ИЗ
| Документ.РеализацияТовара.Товары КАК РеализацияТовараТовары
|ГДЕ
| РеализацияТовараТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РеализацияТовараТовары.Товар,
| РеализацияТовараТовары.Ссылка.Менеджер,
| РеализацияТовараТовары.Ссылка.Контрагент”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“ДатаДок”, Дата);
Результат = Запрос.Выполнить();
ТЗ = Результат.Выгрузить();
Движения.ПродажиНоменклатуры.Записывать=Истина;
Движения.ПродажиНоменклатуры.Загрузить(ТЗ);
Движения.ВзаиморасчетыСКонтрагентами.Записывать=Истина;
Если СуммаДокумента>0 Тогда
Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход();
Движение.Период = Дата;
Движение.Контрагент = Контрагент;
Движение.Сумма = СуммаДокумента;
КонецЕсли;
КонецЕсли;
КонецЕсли;
//Сотрем старые проводки по БУ
Набор=Движения.УправленческийРБ;
Набор.Записать(Истина);
Если БУ Тогда
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ТовДок.Товар КАК Товар,
| СУММА(УправленческийРБОстатки.СуммаОстатокДт) КАК ОстСумма,
| СУММА(УправленческийРБОстатки.КоличествоОстатокДт) КАК ОстКоличество,
| СУММА(ТовДок.Количество) КАК ДокКоличество,
| СУММА(-(ЕСТЬNULL(УправленческийРБОстатки.КоличествоОстатокДт, 0) – ТовДок.Количество)) КАК Нехватка,
| СУММА(ВЫБОР
| КОГДА ЕСТЬNULL(УправленческийРБОстатки.КоличествоОстатокДт, 0) – ТовДок.Количество < 0
| ТОГДА 0
| КОГДА ЕСТЬNULL(УправленческийРБОстатки.КоличествоОстатокДт, 0) – ТовДок.Количество = 0
| ТОГДА УправленческийРБОстатки.СуммаОстатокДт
| КОГДА ТовДок.Количество = 0
| ТОГДА 0
| ИНАЧЕ УправленческийРБОстатки.СуммаОстатокДт * ТовДок.Количество / УправленческийРБОстатки.КоличествоОстатокДт
| КОНЕЦ) КАК Себестоимость,
| ПРЕДСТАВЛЕНИЕ(ТовДок.Товар),
| МАКСИМУМ(ТовДок.НомерСтроки) КАК НомерСтроки
|ИЗ
| (ВЫБРАТЬ
| ВложенныйЗапрос.Товар КАК Товар,
| СУММА(ВложенныйЗапрос.Количество) КАК Количество,
| МАКСИМУМ(ВложенныйЗапрос.НомерСтроки) КАК НомерСтроки
| ИЗ
| (ВЫБРАТЬ
| СУММА(РеализацияТовараТовары.Количество * РеализацияТовараТовары.К * ЕСТЬNULL(РеализацияТовараСоставНаборов.Количество, 1)) КАК Количество,
| ЕСТЬNULL(РеализацияТовараСоставНаборов.Комплектующее, РеализацияТовараТовары.Товар) КАК Товар,
| МАКСИМУМ(РеализацияТовараТовары.НомерСтроки) КАК НомерСтроки
| ИЗ
| Документ.РеализацияТовара.Товары КАК РеализацияТовараТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТовара.СоставНаборов КАК РеализацияТовараСоставНаборов
| ПО РеализацияТовараТовары.Товар = РеализацияТовараСоставНаборов.Набор
| ГДЕ
| РеализацияТовараТовары.Ссылка = &Ссылка
| И РеализацияТовараТовары.Товар.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Набор)
| И РеализацияТовараСоставНаборов.Ссылка = &Ссылка
|
| СГРУППИРОВАТЬ ПО
| ЕСТЬNULL(РеализацияТовараСоставНаборов.Комплектующее, РеализацияТовараТовары.Товар)
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| СУММА(РеализацияТовараТовары.Количество * РеализацияТовараТовары.К),
| РеализацияТовараТовары.Товар,
| МАКСИМУМ(РеализацияТовараТовары.НомерСтроки)
| ИЗ
| Документ.РеализацияТовара.Товары КАК РеализацияТовараТовары
| ГДЕ
| РеализацияТовараТовары.Ссылка = &Ссылка
| И РеализацияТовараТовары.Товар.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)
|
| СГРУППИРОВАТЬ ПО
| РеализацияТовараТовары.Товар) КАК ВложенныйЗапрос
|
| СГРУППИРОВАТЬ ПО
| ВложенныйЗапрос.Товар) КАК ТовДок
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.УправленческийРБ.Остатки(
| &Момент,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары),
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Номенклатура),
| Субконто1 В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТовараТовары.Товар
| ИЗ
| Документ.РеализацияТовара.Товары КАК РеализацияТовараТовары
| ГДЕ
| РеализацияТовараТовары.Ссылка = &Ссылка
| И РеализацияТовараТовары.Товар.ТипНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ТипыНоменклатуры.Товар)
| СГРУППИРОВАТЬ ПО
| РеализацияТовараТовары.Товар
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТовараСоставНаборов.Комплектующее
| ИЗ
| Документ.РеализацияТовара.СоставНаборов КАК РеализацияТовараСоставНаборов
| ГДЕ
| РеализацияТовараСоставНаборов.Ссылка = &Ссылка
| СГРУППИРОВАТЬ ПО
| РеализацияТовараСоставНаборов.Комплектующее)) КАК УправленческийРБОстатки
| ПО ТовДок.Товар = УправленческийРБОстатки.Субконто1
|
|СГРУППИРОВАТЬ ПО
| ТовДок.Товар
|
|УПОРЯДОЧИТЬ ПО
| Товар”;
Запрос.УстановитьПараметр(“Момент”, Новый Граница(МоментВремени(),ВидГраницы.Включая));
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Сч_Дт=ПланыСчетов.Управленческий.Себестоимость;
Сч_Кт=ПланыСчетов.Управленческий.Товары;
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.Нехватка>0 Тогда
Если НЕ БезКонтроля Тогда
Отказ=Истина;
КонецЕсли;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “БУ: ТОВАР: “+ВыборкаДетальныеЗаписи.ТоварПредставление+” не хватает “+ВыборкаДетальныеЗаписи.Нехватка+” из “+ВыборкаДетальныеЗаписи.ДокКоличество;
Сообщение.Поле = “Товары[“+(ВыборкаДетальныеЗаписи.НомерСтроки-1)+”].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
ИначеЕсли ВыборкаДетальныеЗаписи.Себестоимость<=0 Тогда
Если НЕ БезКонтроля Тогда
Отказ=Истина;
КонецЕсли;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “БУ: ТОВАР: “+ВыборкаДетальныеЗаписи.ТоварПредставление+” себестоимость = “+ВыборкаДетальныеЗаписи.Себестоимость;
Сообщение.Поле = “Товары[“+(ВыборкаДетальныеЗаписи.НомерСтроки-1)+”].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
Проводка=Набор.Добавить();
Проводка.Период=Дата;
Проводка.СчетДт=Сч_Дт;
Проводка.СчетКт=Сч_Кт;
Проводка.СубконтоКт.Номенклатура=ВыборкаДетальныеЗаписи.Товар;
Проводка.КоличествоКт=ВыборкаДетальныеЗаписи.ДокКоличество;
Проводка.Сумма=ВыборкаДетальныеЗаписи.Себестоимость;
КонецЦикла;
КонецЕсли;
Проводка=Набор.Добавить();
Проводка.Период=Дата;
Проводка.СчетДт=ПланыСчетов.Управленческий.Покупатели;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты]=Контрагент;
Проводка.СчетКт=ПланыСчетов.Управленческий.Выручка;
Проводка.Сумма=СуммаДокумента;
Набор.Записать(Истина);
КонецЕсли;
КонецПроцедуры
</code>
В Выписке получилось так:
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если не БУ Тогда
//Сотрем старые проводки по БУ
Набор=Движения.УправленческийРБ;
Набор.Записать(Истина);
КонецЕсли;
Если не УУ Тогда
//Сотрем старые движ. по УУ
Набор=Движения.ВзаиморасчетыСКонтрагентами;
Набор.Записать(Истина);
КонецЕсли;
Если БУ или УУ Тогда
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ВыпискаПлатежи.Контрагент КАК Контрагент,
| СУММА(ВыпискаПлатежи.Приход) КАК Приход,
| СУММА(ВыпискаПлатежи.Расход) КАК Расход,
| ВыпискаПлатежи.КоррСчет
|ИЗ
| Документ.Выписка.Платежи КАК ВыпискаПлатежи
|ГДЕ
| ВыпискаПлатежи.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ВыпискаПлатежи.Контрагент,
| ВыпискаПлатежи.КоррСчет
|
|УПОРЯДОЧИТЬ ПО
| Контрагент”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Движения.ВзаиморасчетыСКонтрагентами.Записывать=Истина;
Движения.ВзаиморасчетыСКонтрагентами.Очистить();
Результат = Запрос.Выполнить();
Если УУ Тогда
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.Приход<>0 Тогда
Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьПриход();
Движение.Период = Дата;
Движение.Контрагент = ВыборкаДетальныеЗаписи.Контрагент;
Движение.Сумма = ВыборкаДетальныеЗаписи.Приход;
КонецЕсли;
Если ВыборкаДетальныеЗаписи.Расход<>0 Тогда
Движение = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход();
Движение.Период = Дата;
Движение.Контрагент = ВыборкаДетальныеЗаписи.Контрагент;
Движение.Сумма = ВыборкаДетальныеЗаписи.Расход;
КонецЕсли;
КонецЦикла;
КонецЕсли;
Если БУ Тогда
ВидСубконтоКонтрагенты=ПланыВидовХарактеристик.ВидыСубконто.Контрагенты;
Сч_51=ПланыСчетов.Управленческий.Банк;
Набор=Движения.УправленческийРБ;
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.Приход<>0 Тогда
Проводка=Набор.Добавить();
Проводка.Период=Дата;
Проводка.СчетДт=Сч_51;
Проводка.СчетКт=ВыборкаДетальныеЗаписи.КоррСчет;
Проводка.СубконтоКт[ВидСубконтоКонтрагенты]=ВыборкаДетальныеЗаписи.Контрагент;
Проводка.Сумма=ВыборкаДетальныеЗаписи.Приход;
КонецЕсли;
Если ВыборкаДетальныеЗаписи.Расход<>0 Тогда
Проводка=Набор.Добавить();
Проводка.Период=Дата;
Проводка.СчетКт=Сч_51;
Проводка.СчетДт=ВыборкаДетальныеЗаписи.КоррСчет;
Проводка.СубконтоДт[ВидСубконтоКонтрагенты]=ВыборкаДетальныеЗаписи.Контрагент;
Проводка.Сумма=ВыборкаДетальныеЗаписи.Расход;
КонецЕсли;
КонецЦикла;
Набор.Записать(Истина);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
БУ=Истина;
УУ=Истина;
СсылкаКонтрагент=ДанныеЗаполнения.Ссылка;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| УправленческийРБОстатки.Счет КАК КоррСчет,
| СУММА(ВЫБОР
| КОГДА УправленческийРБОстатки.СуммаОстаток > 0
| ТОГДА УправленческийРБОстатки.СуммаОстаток
| ИНАЧЕ 0
| КОНЕЦ) КАК Приход,
| УправленческийРБОстатки.Субконто1 КАК Контрагент,
| ВЫБОР
| КОГДА УправленческийРБОстатки.СуммаОстаток < 0
| ТОГДА -УправленческийРБОстатки.СуммаОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК Расход
|ИЗ
| РегистрБухгалтерии.УправленческийРБ.Остатки(
| ,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Поставщики)
| ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели),
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты),
| Субконто1 = &Контрагент) КАК УправленческийРБОстатки
|
|СГРУППИРОВАТЬ ПО
| УправленческийРБОстатки.Счет,
| УправленческийРБОстатки.Субконто1,
| ВЫБОР
| КОГДА УправленческийРБОстатки.СуммаОстаток < 0
| ТОГДА -УправленческийРБОстатки.СуммаОстаток
| ИНАЧЕ 0
| КОНЕЦ”;
Запрос.УстановитьПараметр(“Контрагент”, СсылкаКонтрагент);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
ЭтотОбъект.Платежи.Загрузить(Результат.Выгрузить());
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
Акт сверки (заполнение).:
<code>
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
Контрагент=Объект.Контрагент;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| УправленческийРБОстаткиИОбороты.Регистратор КАК Документ,
| УправленческийРБОстаткиИОбороты.СуммаОборотДт КАК УвеличениеДолга,
| УправленческийРБОстаткиИОбороты.СуммаОборотКт КАК УменьшениеДолга,
| УправленческийРБОстаткиИОбороты.СуммаНачальныйОстаток КАК СуммаНачальныйОстаток,
| УправленческийРБОстаткиИОбороты.СуммаКонечныйОстаток КАК СуммаКонечныйОстаток
|ИЗ
| РегистрБухгалтерии.УправленческийРБ.ОстаткиИОбороты(
| &НачалоПериода,
| &КонецПериода,
| Авто,
| ДвиженияИГраницыПериода,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Поставщики)
| ИЛИ Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Покупатели),
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты),
| Субконто1 = &Контрагент) КАК УправленческийРБОстаткиИОбороты”;
Запрос.УстановитьПараметр(“НачалоПериода”, НачалоДня(Объект.НачалоПериода));
Запрос.УстановитьПараметр(“КонецПериода”, Новый Граница(КонецДня(Объект.КонецПериода),ВидГраницы.Включая));
Запрос.УстановитьПараметр(“Контрагент”, Объект.Контрагент);
Результат=Запрос.Выполнить();
Если Результат.Пустой() Тогда
Объект.Обороты.Очистить();
Объект.НачальнаяЗадолженность=0;
Объект.КонечнаяЗадолженность=0;
Иначе
ТЗ=Результат.Выгрузить();
ТЗ_КолСтрок=ТЗ.Количество();
Объект.НачальнаяЗадолженность=ТЗ.Получить(0).СуммаНачальныйОстаток;
Объект.КонечнаяЗадолженность=ТЗ.Получить(ТЗ_КолСтрок-1).СуммаКонечныйОстаток;
Если НЕ ЗначениеЗаполнено(ТЗ.Получить(ТЗ_КолСтрок-1).Документ) Тогда
ТЗ.Удалить(ТЗ_КолСтрок-1);
КонецЕсли;
Если ТЗ_КолСтрок>1 Тогда
Если НЕ ЗначениеЗаполнено(ТЗ.Получить(0).Документ) Тогда
ТЗ.Удалить(0);
КонецЕсли;
КонецЕсли;
Если ТЗ.Количество()>0 Тогда
Объект.Обороты.Загрузить(ТЗ);
Иначе
Объект.Обороты.Очистить();
КонецЕсли;
КонецЕсли;
КонецПроцедуры // ЗаполнитьНаСервере()
</code>
Данные о нач. и кон. сальдо храню в документе для информационной устойчивости. Печать сделал через Команду и Модуль Менеджера.
Для возможности раздельного ведения бухгалтерского учета во все документы, кроме документов «КонтактСКлиентом», «Операция» и «АктСверкиВзаиморасчетов» добавлены реквизиты УУ и БУ типа Булево и созданы связанные с ними элементы в формах этих документов. Проведение документа «Поступление товаров» выглядит следующим образом:
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Для каждого НаборЗаписей Из Движения Цикл
НаборЗаписей.Записывать = Истина;
КонецЦикла;
Если УУ Тогда
РезультатОстаткиТоваров = РаботаСДокументамиСервер.ПолучитьДанныеПоТоварамДокумента(Ссылка, Дата);
РезультатЗакупки = РаботаСДокументамиСервер.ПолучитьДанныеПоНоменклатуреДокумента(Ссылка, Дата, Контрагент);
ДвиженияПоРегистрамСервер.ДвиженияПоНоменклатуре(Движения, РезультатОстаткиТоваров, РезультатЗакупки);
Запись = Движения.Взаиморасчеты.ДобавитьРасход();
Запись.Период = Дата;
Запись.Контрагент = Контрагент;
Запись.Сумма = СуммаДокумента;
Движения.Взаиморасчеты.Записывать = Истина;
КонецЕсли;
Если БУ Тогда
РезультатТМЦ = РаботаСДокументамиСервер.ПолучитьДанныеПоТМЦДокумента(Ссылка, Дата, ПланыСчетов.Хозрасчетный.Поставщики, Контрагент);
ДвиженияПоРегистрамСервер.ДвиженияПоБУ(Движения, РезультатТМЦ);
КонецЕсли;
КонецПроцедуры
</code>
Функция ПолучитьДанныеПоТМЦДокумента() общего модуля РаботаСДокументамиСервер:
<code>
Функция ПолучитьДанныеПоТМЦДокумента(Ссылка, Дата, КорСчет, Контрагент = Неопределено) Экспорт
ИмяТаблицы = “Документ.”+Ссылка.Метаданные().Имя+”.Товары”;
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| &Период,
| ДокТовары.Номенклатура КАК СубконтоДт1,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары) КАК ВидСубконтоДт1,
| ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары) КАК СчетДт,
| &СубконтоКт1 КАК СубконтоКт1,
| &ВидСубконтоКт1 КАК ВидСубконтоКт1,
| &КорСчет КАК СчетКт,
| СУММА(ДокТовары.Сумма) КАК Сумма,
| СУММА(ДокТовары.Количество) КАК КоличествоДт,
| NULL КАК Номенклатура
|ИЗ
| &ДокументТовары КАК ДокТовары
|ГДЕ
| ДокТовары.Ссылка = &Ссылка
| И ДокТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
|
|СГРУППИРОВАТЬ ПО
| ДокТовары.Номенклатура”;
Если КорСчет = ПланыСчетов.Хозрасчетный.Поставщики Тогда
Запрос.Текст = Запрос.Текст +
”
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| &Период,
| NULL,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка),
| ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Затраты),
| &СубконтоКт1,
| &ВидСубконтоКт1,
| &КорСчет,
| СУММА(ДокТовары.Сумма),
| NULL,
| ДокТовары.Номенклатура
|ИЗ
| &ДокументТовары КАК ДокТовары
|ГДЕ
| ДокТовары.Ссылка = &Ссылка
| И ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
|
|СГРУППИРОВАТЬ ПО
| ДокТовары.Номенклатура”;
Запрос.УстановитьПараметр(“СубконтоКт1”, Контрагент);
Запрос.Текст = СтрЗаменить(Запрос.Текст, “&ВидСубконтоКт1”, “ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты)”);
Иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, “&СубконтоКт1”, “NULL”);
Запрос.Текст = СтрЗаменить(Запрос.Текст, “&ВидСубконтоКт1”, “ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)”);
КонецЕсли;
Запрос.Текст = СтрЗаменить(Запрос.Текст, “&ДокументТовары”, ИмяТаблицы);
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Период”, Дата);
Запрос.УстановитьПараметр(“КорСчет”, КорСчет);
Возврат Запрос.Выполнить();
КонецФункции
</code>
При проведении Авансового отчета работает такой же точно механизм разделения управленческого и бухгалтерского учета. Т. е. в начале проведения свойство «Записывать» всех наборов записей регистров, по которым документ может делать движения, устанавливается в значение «Истина». После этого движения формируются только при условии, что взведен соответствующий флажок. Таким образом, те наборы записей, по которым движения в ходе проведения не были сформированы, записываются пустыми или, другими словами, движения формируются только по тем регистрам, которые входят в выбранный вид (выбранные виды) учета.
Для оценки наличия списываемых ТМЦ введен количественный учет на счетах их учета: 41, 41.01 и 41.02. Часть кода проведения документа «РеализацияТоваров»:
<code>
Процедура ДвиженияБухгалтерскогоУчета(Отказ, РежимПроведения)
Движения.РегистрБухгалтерииХозрасчетный.Очистить();
Движения.РегистрБухгалтерииХозрасчетный.Записать();
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.НомерСтроки,
| Товары.Количество КАК КолДок,
| Товары.Сумма КАК СумДок,
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.КоличествоОстатокДт, 0) КАК КолОст,
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстатокДт, 0) КАК СумОст
|ИЗ
| (ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
| МАКСИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки,
| СУММА(РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.К) КАК Количество,
| СУММА(РеализацияТоваровТовары.Сумма) КАК Сумма
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура) КАК Товары,
| РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(
| &Момент,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары),
| ,
| Субконто1 В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТовары.Номенклатура
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка)) КАК РегистрБухгалтерииХозрасчетныйОстатки”;
Запрос.УстановитьПараметр(“Момент”, МоментВремени());
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Нехватка = Выборка.КолДок – Выборка.КолОст;
Если Нехватка>0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Товара ” + Выборка.Номенклатура + ” не достаточно в количестве ” + Нехватка;
Сообщение.Поле = “Товары[“+(Выборка.НомерСтроки-1)+”].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Себестоимость;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.Товары;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Товары] = Выборка.Номенклатура;
Проводка.КоличествоКт = Выборка.КолДок;
Если Выборка.КолОст<>0 Тогда
Проводка.Сумма = Выборка.СумОст*Выборка.КолДок/Выборка.КолОст;
Иначе
Проводка.Сумма = 0;
КонецЕсли;
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Покупатели;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.Выручка;
Проводка.Сумма = СуммаДокумента;
КонецЦикла;
Если Не Отказ Тогда
Движения.РегистрБухгалтерииХозрасчетный.Записывать = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если УУ Тогда
ДвиженияОперативногоУчета(Отказ, РежимПроведения);
Иначе
Если Проведен Тогда
Для каждого НаборЗаписей Из Движения Цикл
Если Найти(Строка(НаборЗаписей),”РегистрНакопленияНаборЗаписей”) > 0 Тогда
НаборЗаписей.Записывать = Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
Если БУ Тогда
ДвиженияБухгалтерскогоУчета(Отказ, РежимПроведения);
Иначе
Если Проведен Тогда
Для каждого НаборЗаписей Из Движения Цикл
Если Найти(Строка(НаборЗаписей),”РегистрБухгалтерииНаборЗаписей”) > 0 Тогда
НаборЗаписей.Записывать = Истина;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
Проверка наличия достаточного количества номенклатуры для списания при записи документа «Операция» реализована в процедуре ПриЗаписи() модуля набора записей регистра бухгалтерии и почти не отличается от решения, приведенного в видеоуроках, за исключением того, что при проверке остатков исключаются услуги:
<code>
Запрос.Текст =
“ВЫБРАТЬ
| РегистрБухгалтерииХозрасчетныйОстатки.Субконто1 КАК Товар,
| -РегистрБухгалтерииХозрасчетныйОстатки.КоличествоОстатокДт КАК Нехватка
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(
| &Момент,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары),
| ,
| Субконто1 В
| (ВЫБРАТЬ
| РегистрБухгалтерииХозрасчетныйДвиженияССубконто.СубконтоКт1
| ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.ДвиженияССубконто(, , Регистратор = &Ссылка
| И СчетКт = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)
| И СубконтоКт1.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга), , )
|КАК РегистрБухгалтерииХозрасчетныйДвиженияССубконто)) КАК РегистрБухгалтерииХозрасчетныйОстатки
|ГДЕ
| РегистрБухгалтерииХозрасчетныйОстатки.КоличествоОстатокДт < 0”;
</code>
Механизм автоматического заполнения табличной части документа «Выписка» при вводе на основании контрагента реализован в процедуре ОбработкаЗаполнения() модуля документа:
<code>
Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РегистрБухгалтерииХозрасчетныйОстатки.Счет,
| РегистрБухгалтерииХозрасчетныйОстатки.Субконто1,
| РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстаток КАК ДолгКонтрагента,
| РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстатокДт,
| РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстатокКт
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(, , ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты), Субконто1 = &Контрагент) КАК РегистрБухгалтерииХозрасчетныйОстатки”;
Запрос.УстановитьПараметр(“Контрагент”, ДанныеЗаполнения);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Если ВыборкаДетальныеЗаписи.Счет = ПланыСчетов.Хозрасчетный.Покупатели И ВыборкаДетальныеЗаписи.СуммаОстатокДт > 0 Тогда
НоваяСтрока = Оплаты.Добавить();
НоваяСтрока.Контрагент = ДанныеЗаполнения;
НоваяСтрока.КорСчет = ВыборкаДетальныеЗаписи.Счет;
НоваяСтрока.Приход = ВыборкаДетальныеЗаписи.СуммаОстатокДт;
КонецЕсли;
Если ВыборкаДетальныеЗаписи.Счет = ПланыСчетов.Хозрасчетный.Поставщики И ВыборкаДетальныеЗаписи.СуммаОстатокКт > 0 Тогда
НоваяСтрока = Оплаты.Добавить();
НоваяСтрока.Контрагент = ДанныеЗаполнения;
НоваяСтрока.КорСчет = ВыборкаДетальныеЗаписи.Счет;
НоваяСтрока.Расход = ВыборкаДетальныеЗаписи.СуммаОстатокКт;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры
</code>
Заполнение табличной части документа «Акт сверки взаиморасчетов» при нажатии на кнопку «Заполнить» реализовано в модуле формы документа:
<code>
&НаКлиенте
Процедура Заполнить(Команда)
ЗаполнитьНаСервере();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНаСервере()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РегистрБухгалтерииХозрасчетныйОбороты.Регистратор КАК Документ,
| РегистрБухгалтерииХозрасчетныйОбороты.СуммаОборотДт КАК СуммаУвеличенияДолга,
| РегистрБухгалтерииХозрасчетныйОбороты.СуммаОборотКт КАК СуммаУменьшенияДолга
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Обороты(&ДатаНачала, &ДатаОкончания, Регистратор, , ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты), Субконто1 = &Контрагент, , ) КАК РегистрБухгалтерииХозрасчетныйОбороты
|
|УПОРЯДОЧИТЬ ПО
| РегистрБухгалтерииХозрасчетныйОбороты.Период,
| Документ”;
Запрос.УстановитьПараметр(“ДатаНачала”, Объект.ДатаНачала);
Запрос.УстановитьПараметр(“ДатаОкончания”, ?(Объект.ДатаОкончания = Дата(1, 1, 1), Объект.ДатаОкончания, КонецДня(Объект.ДатаОкончания) + 1));
Запрос.УстановитьПараметр(“Контрагент”, Объект.Контрагент);
Результат = Запрос.Выполнить();
Объект.Взаиморасчеты.Загрузить(Результат.Выгрузить());
КонецПроцедуры // ЗаполнитьНаСервере()
&НаКлиенте
Процедура КонтрагентПриИзменении(Элемент)
Объект.Взаиморасчеты.Очистить();
КонецПроцедуры
</code>
При печати документа долг контрагента на начало периода определяется запросом к виртуальной таблице регистра бухгалтерии Остатки. Долг на окончание периода вычисляется в процессе вывода строк табличной части в табличный документ:
<code>
Процедура Печать(ТабДок, Ссылка) Экспорт
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РегистрБухгалтерииХозрасчетныйОстатки.Субконто1,
| РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстатокДт – РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстатокКт КАК ДолгКонтрагента
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(&ДатаНачала, , ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты), Субконто1 = &Контрагент) КАК РегистрБухгалтерииХозрасчетныйОстатки”;
Запрос.УстановитьПараметр(“ДатаНачала”, Ссылка[0].Ссылка.ДатаНачала);
Запрос.УстановитьПараметр(“ДатаОкончания”, Ссылка[0].Ссылка.ДатаОкончания);
Запрос.УстановитьПараметр(“Контрагент”, Ссылка[0].Ссылка.Контрагент);
Результат = Запрос.Выполнить();
Если Не Результат.Пустой() Тогда
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
НачальныйДолгКонтрагента = ВыборкаДетальныеЗаписи.ДолгКонтрагента;
КонецЕсли;
Иначе
НачальныйДолгКонтрагента = 0;
КонецЕсли;
КонечныйДолгКонтрагента = НачальныйДолгКонтрагента;
Макет = Документы.АктСверкиВзаиморасчетов.ПолучитьМакет(“Печать”);
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| АктСверкиВзаиморасчетов.Дата,
| АктСверкиВзаиморасчетов.ДатаНачала,
| АктСверкиВзаиморасчетов.ДатаОкончания,
| АктСверкиВзаиморасчетов.Контрагент,
| АктСверкиВзаиморасчетов.Номер,
| АктСверкиВзаиморасчетов.Взаиморасчеты.(
| НомерСтроки,
| Документ,
| СуммаУвеличенияДолга,
| СуммаУменьшенияДолга
| )
|ИЗ
| Документ.АктСверкиВзаиморасчетов КАК АктСверкиВзаиморасчетов
|ГДЕ
| АктСверкиВзаиморасчетов.Ссылка В (&Ссылка)”;
Запрос.Параметры.Вставить(“Ссылка”, Ссылка);
Выборка = Запрос.Выполнить().Выбрать();
ОбластьЗаголовок = Макет.ПолучитьОбласть(“Заголовок”);
Шапка = Макет.ПолучитьОбласть(“Шапка”);
ОбластьВзаиморасчетыШапка = Макет.ПолучитьОбласть(“ВзаиморасчетыШапка”);
ОбластьВзаиморасчеты = Макет.ПолучитьОбласть(“Взаиморасчеты”);
ТабДок.Очистить();
ВставлятьРазделительСтраниц = Ложь;
Пока Выборка.Следующий() Цикл
Если ВставлятьРазделительСтраниц Тогда
ТабДок.ВывестиГоризонтальныйРазделительСтраниц();
КонецЕсли;
ТабДок.Вывести(ОбластьЗаголовок);
Шапка.Параметры.Заполнить(Выборка);
ТабДок.Вывести(Шапка, Выборка.Уровень());
ОбластьДолгНаНачало = Макет.ПолучитьОбласть(“ДолгНаНачало”);
ОбластьДолгНаНачало.Параметры.НачальныйДолгКонтрагента = НачальныйДолгКонтрагента;
ТабДок.Вывести(ОбластьДолгНаНачало);
ТабДок.Вывести(ОбластьВзаиморасчетыШапка);
ВыборкаВзаиморасчеты = Выборка.Взаиморасчеты.Выбрать();
Пока ВыборкаВзаиморасчеты.Следующий() Цикл
ОбластьВзаиморасчеты.Параметры.Заполнить(ВыборкаВзаиморасчеты);
ТабДок.Вывести(ОбластьВзаиморасчеты, ВыборкаВзаиморасчеты.Уровень());
КонечныйДолгКонтрагента = КонечныйДолгКонтрагента + ВыборкаВзаиморасчеты.СуммаУвеличенияДолга
– ВыборкаВзаиморасчеты.СуммаУменьшенияДолга;
КонецЦикла;
ОбластьДолгНаОкончание = Макет.ПолучитьОбласть(“ДолгНаОкончание”);
ОбластьДолгНаОкончание.Параметры.КонечныйДолгКонтрагента = КонечныйДолгКонтрагента;
ТабДок.Вывести(ОбластьДолгНаОкончание);
ВставлятьРазделительСтраниц = Истина;
КонецЦикла;
КонецПроцедуры
</code>
Выполнено.
Рекв. УУ, БУ – булево. В обработках проведения для очистки движений добавил:
<code>Для каждого Движение Из Движения Цикл
Движение.Записывать = Истина;
КонецЦикла;
Если НЕ УУ И НЕ БУ Тогда
Возврат;
КонецЕсли;
Если УУ Тогда
//…</code>
Движения по БУ реализовал, нужную аналитику на счета расчетов добавил.
Модуль реализации (фрагмент – вывод регистра “в ноль”):
<code>Пока Выборка.Следующий() Цикл
Если Выборка.Нехватка > 0 Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “По БУ не хватает “+Выборка.Нехватка+” единиц номенклатуры!”;
Сообщение.Поле = “Товары[“+(Выборка.НомерСтроки-1)+”].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
//движения БУ
//списание товаров
Движение = Движения.РегистрБухгалтерииРабочий.Добавить();
Движение.Период = Дата;
Движение.СчетДт = СчетСС;
Движение.СчетКт = СчетТовары;
Движение.СубконтоКт[ВидСубконтоНоменклатура] = Выборка.Номенклатура;
Движение.КоличествоКт = Выборка.КолДок;
//вывод регистра “в ноль”
Если Выборка.КолДок>=Выборка.СуммаОстаток Тогда
СуммаСписания = Выборка.СуммаОстаток;
Иначе
СуммаСписания = ?(Выборка.КоличествоОстаток = 0, 0,Выборка.СуммаОстаток*Выборка.КолДок/Выборка.КоличествоОстаток);
КонецЕсли;
Движение.Сумма = СуммаСписания;
//…</code>
Заполнение выписки:
<code>Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка)
Если ТипЗнч(ДанныеЗаполнения) = Тип(“СправочникСсылка.Контрагенты”) Тогда
УУ = Истина;
БУ = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| &Контрагент КАК Контрагент,
| РегистрБухгалтерииРабочийОстатки.Счет КАК КоррСчет,
| РегистрБухгалтерииРабочийОстатки.СуммаОстаток,
| ВЫБОР
| КОГДА РегистрБухгалтерииРабочийОстатки.СуммаОстаток > 0
| ТОГДА РегистрБухгалтерииРабочийОстатки.СуммаОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК ПриходСумма,
|
| ВЫБОР
| КОГДА РегистрБухгалтерииРабочийОстатки.СуммаОстаток < 0
| ТОГДА -РегистрБухгалтерииРабочийОстатки.СуммаОстаток
| ИНАЧЕ 0
| КОНЕЦ КАК РасходСумма
|
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииРабочий.Остатки(
| &Дата,
| Счет = &СчетПокупатели
| ИЛИ Счет = &СчетПоставщики,
| ,
| Субконто1 = &Контрагент) КАК РегистрБухгалтерииРабочийОстатки”;
Запрос.УстановитьПараметр(“Дата”, КонецДня(ТекущаяДата())+1);
Запрос.УстановитьПараметр(“Контрагент”, ДанныеЗаполнения);
Запрос.УстановитьПараметр(“СчетПокупатели”, ПланыСчетов.Рабочий.Покупатели);
Запрос.УстановитьПараметр(“СчетПоставщики”, ПланыСчетов.Рабочий.Поставщики);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Платежи.Загрузить(Результат.Выгрузить());
КонецЕсли;
КонецЕсли;
КонецПроцедуры</code>
Акт сверки – таб. часть “Взаиморасчеты” с невыведенными на форму реквизитами “НачОстаток”, “КонОстаток”,
используемые для печати. Заполнение:
<code>&НаСервере
Процедура ЗаполнитьНаСервере()
Объект.Взаиморасчеты.Очистить();
СчетПокупатели = ПланыСчетов.Рабочий.Покупатели;
СчетПоставщики = ПланыСчетов.Рабочий.Поставщики;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РегистрБухгалтерииРабочийОстаткиИОбороты.Период КАК Период,
| РегистрБухгалтерииРабочийОстаткиИОбороты.Регистратор КАК Документ,
| РегистрБухгалтерииРабочийОстаткиИОбороты.СуммаНачальныйОстаток КАК НачОстаток,
| РегистрБухгалтерииРабочийОстаткиИОбороты.СуммаКонечныйОстаток КАК КонОстаток,
| РегистрБухгалтерииРабочийОстаткиИОбороты.СуммаОборотКт КАК УменьшениеДолга,
| РегистрБухгалтерииРабочийОстаткиИОбороты.СуммаОборотДт КАК УвеличениеДолга
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииРабочий.ОстаткиИОбороты(
| &НачДата,
| &КонДата,
| Регистратор,
| ,
| Счет = &СчетПокупатели
| ИЛИ Счет = &СчетПоставщики,
| ,
| Субконто1 = &Контрагент) КАК РегистрБухгалтерииРабочийОстаткиИОбороты
|
|УПОРЯДОЧИТЬ ПО
| Период”;
Запрос.УстановитьПараметр(“КонДата”, Объект.КонДата); //тут включая
Запрос.УстановитьПараметр(“Контрагент”, Объект.Контрагент);
Запрос.УстановитьПараметр(“НачДата”, Объект.НачДата);
Запрос.УстановитьПараметр(“СчетПокупатели”, СчетПокупатели);
Запрос.УстановитьПараметр(“СчетПоставщики”, СчетПоставщики);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Объект.Взаиморасчеты.Загрузить(Результат.Выгрузить());
КонецЕсли;
КонецПроцедуры</code>
Печать – если документ не записан или форма модифицирована – принудительно записываю.
Запрос к таб.части документа.
Нашел опечатку:
<code>//вывод регистра “в ноль”
Если Выборка.КолДок>=Выборка.СуммаОстаток Тогда</code>
Заменить на:
<code>//вывод регистра “в ноль”
Если Выборка.КолДок>=Выборка.КоличествоОстаток Тогда</code>
Задание выполнено.
Добавлен в ПланСчетов признак учета и признак учета субконто «Количественный». В РегистрБухгалтерии добавлен небалансовый ресурс Количество с признаками учета Количественный. Добавлена аналитика Контрагенты по счету 60 и 62. Добавлены реквизиты УУ и БУ в документы и изменен порядок выполнения процедур и функций.
Изменил функцию ПолучитьДанныеПоТМЦДокумента:
<code>
Функция ПолучитьДанныеПоТМЦДокумента(Ссылка, Дата, КорСчет,Контрагент) Экспорт
ИмяТаблицы = “Документ.”+Ссылка.Метаданные().Имя+”.Товары”;
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| &Период,
| ВЫБОР
| КОГДА ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Затраты)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)
| КОНЕЦ КАК СчетДт,
| ВЫБОР
| КОГДА ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары)
| КОНЕЦ КАК ВидСубконтоДт1,
| ДокТовары.Номенклатура КАК СубконтоДт1,
| &КорСчет КАК СчетКт,
| ВЫБОР
| КОГДА &КорСчет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Поставщики)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| КОНЕЦ КАК ВидСубконтоКт1,
| &Контрагент КАК СубконтоКт1,
| СУММА(ДокТовары.Сумма) КАК Сумма,
| СУММА(ВЫБОР
| КОГДА ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
| ТОГДА 0
| ИНАЧЕ ДокТовары.Количество
| КОНЕЦ) КАК КоличествоДт
|ИЗ
| &ДокументТовары КАК ДокТовары
|ГДЕ
| ДокТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ДокТовары.Номенклатура,
| ВЫБОР
| КОГДА ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары)
| КОНЕЦ,
| ВЫБОР
| КОГДА ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Затраты)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары)
| КОНЕЦ”;
Запрос.Текст = СтрЗаменить(Запрос.Текст, “&ДокументТовары”, ИмяТаблицы);
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Период”, Дата);
Запрос.УстановитьПараметр(“КорСчет”, КорСчет);
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Возврат Запрос.Выполнить();
КонецФункции
</code>
Себестоимость рассчитывал аналогично рассмотренному в задании
В Выписку добавил процедуру ОбработкаЗаполнения и изменил процедуру ЗаполнениеДокументовСервер.ЗаполнитьПоКонтрагенту(ДанныеЗаполнения, ЭтотОбъект) в процедуру добавлен запрос и обработка запроса в цикле.
Документ АктСверки заполнил запросом к виртуальной таблице ДвиженияССубконто при печати остатки получаю запросом к вирт таблице Остатки
Задание выполнил. Сложностей не возникло. Во всех документах проставил флаги, с помощью которых разделил учёт.
Списание реализовал через запрос:
<code>
“ВЫБРАТЬ
| Товары.Номенклатура,
| СУММА(Товары.Количество) КАК КолДок,
| СУММА(Товары.Сумма) КАК СумДок,
| МИНИМУМ(Товары.НомерСтроки) – 1 КАК НомерСтроки,
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстатокДт, 0) КАК СумОст,
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.КоличествоОстатокДт, 0) КАК КолОст,
| Товары.Ссылка.Контрагент КАК Контрагент
|ИЗ
| Документ.РеализацияТоваров.Товары КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(
| &Момент,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары),
| ,
| Субконто1 В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТовары.Номенклатура
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка)) КАК РегистрБухгалтерииХозрасчетныйОстатки
| ПО Товары.Номенклатура = РегистрБухгалтерииХозрасчетныйОстатки.Субконто1
|ГДЕ
| Товары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| Товары.Номенклатура,
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстатокДт, 0),
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.КоличествоОстатокДт, 0),
| Товары.Ссылка.Контрагент”;
</code>
Всё остальное реализовал с легкостью. Открыл для себя очень полезную фишку, чтобы в документе “Выписка” в табличной части, можно было выбрать только счет покупателей или поставщиков достаточно на форме в свойствах указать СписокВыбора и поставить галочку РежимВыбора.
Задание выполнил.
1. Добавил в документы флаги отражения в различных видах учета. Изменил модули проведения, разнес по двум процедурам формирование проводок и записей регистров накопления.
2. Организовал проведения документа поступления по регистру бухгалтерии. Формируются проводки по товарам(Дт41-Кт60) и одна проводка по услугам(Дт26-Кт60). Проводки формирую одним запросом, после чего загружаю в набор записей документа.
3. Организовал аналитический учет по контрагентам на счетах взаиморасчетов.
4. Организовал списание товара в реализации по БУ методом среднескользящей оценки. Аналогично примеру, рассмотренному в материалах курса.
5. Организовал проведение документа “Выписка” по счетам взаиморасчетов. Проводки формирую в запросе.
6. Создал документ “Акт сверки взаиморасчетов”. Обеспечил его автозаполнение согласно требованиям задания. Информацию для заполнения получаю запросом из виртуальной таблицы “ДвиженияССубконто” регистра бухгалтерии.
Задание выполнил.
Добавил к некоторым счетам признак учета “количественный” и новый ресурс к регистру Бухгалтерии. Соответственно модифицировал документы
Отчет <a href=”http://narod.ru/disk/14508242001/%D0%97%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D0%B5_11.doc.html”>Задание_11.doc</a><br/>
Заполнение Выписки на основании КОнтрагента сделал путем загрузки результата запроса в табличную часть. Текст запроса
“ВЫБРАТЬ
| ХозрасчетныйОстатки.Субконто1 КАК Контрагент,
| ХозрасчетныйОстатки.СуммаОстатокДт КАК Приход,
| 0 КАК Расход,
| ХозрасчетныйОстатки.Счет КАК СчетУчета
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(
| &МоментВремени,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Покупатели)
| ,
| ,
| Субконто1 = &Контрагент) КАК ХозрасчетныйОстатки
|ОБЪЕДИНИТЬ ВСЕ
|ВЫБРАТЬ
| ХозрасчетныйОстатки.Субконто1 КАК Контрагент,
| 0 КАК Приход,
| ХозрасчетныйОстатки.СуммаОстатокКт КАК Расход,
| ХозрасчетныйОстатки.Счет КАК СчетУчета
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(
| &МоментВремени,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Поставщики),
| ,
| Субконто1 = &Контрагент) КАК ХозрасчетныйОстатки”;
Задание выполнила.
http://fotoifolder.ru/view_full_size/3okexrbna_i7
http://fotoifolder.ru/view_full_size/k19qfzlxq1qp
http://fotoifolder.ru/view_full_size/1igdzq5w69om
Больше всего мучилась с актом взаиморасчетов. То параметры запроса в МФ не работают, то кнопка МФ не видит процедуры МО, то параметры не передаются в ОМ, то в МО не возможно загрузить ТЧ формы. В итоге сделала в МО общий (и для документа и для печатной формы) запрос к ВТ РБ Остатки и Обороты, выгрузила его в ТЗ и загрузила в документ. Так как недостающие реквизиты формы для печатной формы были в выгруженной ТЗ, то печатную форму сделала конструктором.
http://fotoifolder.ru/view_full_size/t4kuwgmrqqcb
При просмотре Универсальный контроль остатков. Реализация алгоритма.
Псевдоним у таблицы потеряли не Вы. При вводе в поле ввода Условие формы ПараметрыВиртуальнойТаблицы система обрезает часть запроса.
Спасибо, Юрий!
Конечно может быть, что видео в поставке Юрия отличается от моего, но в районе 1:00 видно, что при копировании текста запроса псевдоним таблицы как раз и не был “захвачен”. Евгений всё равно молодец! С ошибками даже лучше учится, я местами уже стал замечать, что делается не так. ))
Поставка одна и та же :)
Выполнено. Добавлен признак учета Количественный. В проводки добавлено субконто Контрагенты по 60,62 и Количество для 41.
В поступлении товаров проводки формируются одним запросом по услугам и товарам с разными счетами, результат запроса выгружается в набор записей.
В документе отгрузки контроль остатков по старому методу: очищаются движения, выполняется запрос по остаткам в БУ, в цикле проверяется нехватка и формируются проводки.
Документ Выписка – для реквизита табличной части Счет добавлен список выбора из двух значений – 60,62, кнопку выбора заменена на кнопку списка выбора. Проводки заполняются выгружаемым запросом – через объединение двух запросов к документу по приходу и по расходу.
Ввод на основании справочника Контрагенты тоже запросом к таблице РегистрБухгалтерии Остатки, запрашиваются оба счета, и формируются строки по остаткам по каждому счету, результат выгружается в табличную часть.
Акт сверки – запрос к виртуальной таблице ДвиженияССубконто, результат запроса выгружается в табличную часть. Для получения остатков формируется запрос к виртуальной таблице Остатки. Значения полученных остатков записываются в реквизиты документа ОстатокНачало и ОстатокКонец.
Выполнено.
С вводом новых реквизитов УУ и БУ проведение, например, документа Реализации начинается следующим образом:
………………………….
Если НЕ УУ Тогда
СерверРаботаСДокам.ОчиститьДвижения(Движения.ОстаткиТоваров);
СерверРаботаСДокам.ОчиститьДвижения(Движения.ДолгиКонтрагентов);
СерверРаботаСДокам.ОчиститьДвижения(Движения.Продажи);
КонецЕсли;
Если НЕ БУ Тогда
СерверРаботаСДокам.ОчиститьДвижения(Движения.БухУчет);
КонецЕсли;
Если НЕ (УУ ИЛИ БУ) Тогда //не указаны признаки
Возврат
КонецЕсли;
ТЗДвижений = ПолучитьТаблицуДвиженийДокумента();
Если УУ Тогда
СформироватьДвиженияПоУУ(ТЗДвижений, Отказ);
КонецЕсли;
Если БУ Тогда
СформироватьДвиженияПоБУ(Отказ);
КонецЕсли;
………………………….
Для расчета себестоимости по БУ ввел в план счетов признак Количественный и проставил его по материальным счетам 41.ХХ
Формирование движений по БУ в документе Реализация – как в видео уроках …
Ввод Выписки на основании Контрагента выполняю через запрос:
…………………………………….
ТекКонтрагент = ДанныеЗаполнения;
Если НЕ ТекКонтрагент.ЭтоГруппа Тогда
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| БухУчетОстатки.Субконто1 КАК Контрагент,
| БухУчетОстатки.Счет КАК СчетРасчетов,
| ВЫБОР
| КОГДА БухУчетОстатки.СуммаОстатокДт > 0
| И БухУчетОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Основной.Покупатели)
| ТОГДА БухУчетОстатки.СуммаОстатокДт
| ИНАЧЕ 0
| КОНЕЦ КАК СуммаПриход,
| ВЫБОР
| КОГДА БухУчетОстатки.СуммаОстатокКт > 0
| И БухУчетОстатки.Счет = ЗНАЧЕНИЕ(ПланСчетов.Основной.Поставщики)
| ТОГДА БухУчетОстатки.СуммаОстатокКт
| ИНАЧЕ 0
| КОНЕЦ КАК СуммаРасход
|ИЗ
| РегистрБухгалтерии.БухУчет.Остатки(
| &Момент,
| Счет.Ссылка = ЗНАЧЕНИЕ(ПланСчетов.Основной.Поставщики)
| ИЛИ Счет.Ссылка = ЗНАЧЕНИЕ(ПланСчетов.Основной.Покупатели),
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты),
| Субконто1.Ссылка = &Контрагент) КАК БухУчетОстатки
|
|УПОРЯДОЧИТЬ ПО
| СчетРасчетов”;
Запрос.УстановитьПараметр(“Контрагент”, ТекКонтрагент);
Запрос.УстановитьПараметр(“Момент”, МоментВремени());
Результат = Запрос.Выполнить();
ЭтотОбъект.Взаиморасчеты.Загрузить(Результат.Выгрузить());
КонецЕсли;
…………………………………….
Для печати Акта взаиморасчета с учетом остатков в модуле менеджера документа выполняю запрос (вывожу свернутые остатки по контрагенту):
……………………………………
“ВЫБРАТЬ
| Док.ПервичныйДокумент КАК ПервичныйДокумент,
| Док.КорСчет,
| Док.СуммаУвелДолга,
| Док.СуммаУменДолга
|ИЗ
| Документ.АктВзаиморасчетов.Взаиморасчеты КАК Док
|ГДЕ
| Док.Ссылка = &Ссылка
|
|ОБЪЕДИНИТЬ ВСЕ
|
|ВЫБРАТЬ
| 0,
| 0,
| СУММА(Остатки.НачОст),
| СУММА(Остатки.КонОст)
|ИЗ
| (ВЫБРАТЬ
| СУММА(БухУчетОстатки.СуммаОстаток) КАК НачОст,
| 0 КАК КонОст
| ИЗ
| РегистрБухгалтерии.БухУчет.Остатки(
| &Начало,
| Счет.Ссылка = ЗНАЧЕНИЕ(ПланСчетов.Основной.Покупатели)
| ИЛИ Счет.Ссылка = ЗНАЧЕНИЕ(ПланСчетов.Основной.Поставщики),
| ,
| Субконто1.Ссылка = &Контрагент) КАК БухУчетОстатки
|
| СГРУППИРОВАТЬ ПО
| БухУчетОстатки.Субконто1
|
| ОБЪЕДИНИТЬ ВСЕ
|
| ВЫБРАТЬ
| 0,
| СУММА(БухУчетОстатки.СуммаОстаток)
| ИЗ
| РегистрБухгалтерии.БухУчет.Остатки(
| &Окончание,
| Счет.Ссылка = ЗНАЧЕНИЕ(ПланСчетов.Основной.Покупатели)
| ИЛИ Счет.Ссылка = ЗНАЧЕНИЕ(ПланСчетов.Основной.Поставщики),
| ,
| Субконто1.Ссылка = &Контрагент) КАК БухУчетОстатки
|
| СГРУППИРОВАТЬ ПО
| БухУчетОстатки.Субконто1) КАК Остатки
|
|УПОРЯДОЧИТЬ ПО
| ПервичныйДокумент”
Для заполнения табличной части в модуле формы Акта взаиморасчетов
&НаСервере
Процедура ЗаполнитьВзаиморасчетами()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| БухУчетОбороты.Регистратор КАК ПервичныйДокумент,
//| БухУчетОбороты.Счет КАК Счет,
| БухУчетОбороты.КорСчет КАК КорСчет,
| БухУчетОбороты.СуммаОборотДт КАК СуммаУвелДолга,
| БухУчетОбороты.СуммаОборотКт КАК СуммаУменДолга
|ИЗ
| РегистрБухгалтерии.БухУчет.Обороты(
| &Начало,
| &Окончание,
| Регистратор,
| Счет.ЗапретитьИспользоватьВПроводках = ЛОЖЬ
| И (Счет.Ссылка = ЗНАЧЕНИЕ(ПланСчетов.Основной.Покупатели)
| ИЛИ Счет.Ссылка = ЗНАЧЕНИЕ(ПланСчетов.Основной.Поставщики)),
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты),
| Субконто1.Ссылка = &Контрагент,
| ,
| ) КАК БухУчетОбороты
|
|УПОРЯДОЧИТЬ ПО
| БухУчетОбороты.Период,
| Регистратор,
| Счет,
| КорСчет”;
Запрос.УстановитьПараметр(“Контрагент”, Объект.Контрагент);
Запрос.УстановитьПараметр(“Начало”, НачалоДня(Объект.ПериодНачало));
ВГ = Новый Граница (КонецДня(Объект.ПериодОкончание), ВидГраницы.Включая);
Запрос.УстановитьПараметр(“Окончание”, ВГ);
Результат = Запрос.Выполнить();
Объект.Взаиморасчеты.Загрузить(Результат.Выгрузить());
КонецПроцедуры // ЗаполнитьВзаиморасчетами()
Евгений, в процессе просмотра восьмой лавы возник такой вопрос: (урок кажется – восьмой: Обработка результата запроса. Формирование проводок)
При определении стоимости списания, предположим, что КолДок = 10, СумОст = 10, КолОст = 3. При расчёте по приведённой формуле: СумОст * КолДок / КолОст всё ровно копейки “уйдут” в период. Если сделать принудительное округление – часть суммы Товара “пропадёт” в итоге. Есть способы это исправить?
Способ борьбы с “зависающими” копейками следующий – при полном списании (например, на остатке 5 штук и списывается тоже 5 штук) нужно списывать полную сумму остатка, а не вычислять ее по формуле.
Евгений, скажите, а есть ли возможность смотреть защищенные уроки с со скоростью в полтора раза выше? Качество изложения при этом не теряется, а вот время здорово экономится.
К сожалению, такой возможности нет. Разработчиков озадачили этой задачей, но пока результата нет.
Еще заметил странный глюк – если защищенное видео запущено (проигрывается или на паузе), то перестает работать Ctrl-C / Ctrl-V, не критично, но неудобно, если параллельно с просмотром видео что-то делаешь в базе, приходится закрывать плеер. Может, конечно, это какие-то проблемы исключительно на моей системе (Win7x64)
Это ограничение действительно накладывает защищенное видео. Пока способов обхода данной особенности нет.
Т.к. искользуется для воспроизведения Windows Media Plaer то в нем работают быстрые клавиши
Ctrl+Shift+G ускоренное воспроизведение
Ctrl+Shift+N нормальная скорость
единственный минус иногда убегает звук
Речь идет о просмотре защищенных файлов (.ехе)?