Базовый курс. Занятие №12
Заключительное занятие 3-го блока.
Необходимо изучить следующие главы.
Глава 9. Разработка отчетов.
Глава 10. Сторнирование проводок.
Глава 11. Баланс в нескольких валютах.
Глава 12. Измерения регистра бухгалтерии.
Глава 13. Забалансовые счета.
Также нужно выполнить домашнее задание, текст которого доступен на странице.
Задание необходимо выполнять в ИБ после предыдущего ДЗ.
В этой же теме необходимо написать отчет о выполнении задания.
ps. Участники курса без доступа в мастер-группу отчитываться по домашним заданиям не могут.
— залогиньтесь.
Если не активировали токен — посмотрите видео-инструкцию (видео N5)
Если вы залогинены, у Вас активирован токен доступа, но вы все равно видите эту запись —напишите нам на e-mail поддержки.
Метаданные: создал забалансовый счет 00.02 ХранениеТМЦ( субк. Номенклатура, Контрагенты)
Создал перечисление Видыопераций(Приём, Выдача, покупка, реализация)
Документы:
В ОбработкеПроведения мод. док. Поступление : Если УУ и ВидОперации = Перечисления.ВидыОпераций.Покупка Тогда « двигаем» регистры накопления.
В функции ПолучитДанныеПоТМЦДокумента внёс изменения:
Запрос = Новый Запрос;
Если Ссылка.ВидОперации = Перечисления.ВидыОпераций.Покупка Тогда
Запрос.Текст = "ВЫБРАТЬ
| &Период,
| ДокТовары.Номенклатура КАК СубконтоДт1,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары) КАК ВидСубконтоДт1,
| ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.Товары) КАК СчетДт,
| СУММА(ДокТовары.Количество) КАК КоличествоДт,
| &КорСчет КАК СчетКт,
| &КорСубконто КАК СубконтоКт1,
| &КорВидСубконто КАК ВидСубконтоКт1,
| СУММА(ДокТовары.Сумма) КАК Сумма
|ИЗ
| &ДокументТовары КАК ДокТовары
|ГДЕ
| ДокТовары.Ссылка = &Ссылка
| И ДокТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
|
|СГРУППИРОВАТЬ ПО
| ДокТовары.Номенклатура";
Запрос.УстановитьПараметр("КорСчет", КорСчет);
Если КорСубконто = Неопределено Тогда
КорВидСубконто = ПланыВидовХарактеристик.ВидыСубконто.ПустаяСсылка();
Иначе
КорВидСубконто = ПланыВидовХарактеристик.ВидыСубконто.Контрагенты;
КонецЕсли;
Запрос.УстановитьПараметр("КорВидСубконто", КорВидСубконто);
ИначеЕсли Ссылка.ВидОперации = Перечисления.ВидыОпераций.ПриёмНаХранение Тогда
Запрос.Текст = "ВЫБРАТЬ
| &Период,
| ДокТовары.Номенклатура КАК СубконтоДт1,
| &КорСубконто КАК СубконтоДт2,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары) КАК ВидСубконтоДт1,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты) КАК ВидСубконтоДт2,
| ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ХранениеТМЦ) КАК СчетДт,
| СУММА(ДокТовары.Количество) КАК КоличествоДт,
| СУММА(ДокТовары.Сумма) КАК Сумма
|
|ИЗ
| &ДокументТовары КАК ДокТовары
|ГДЕ
| ДокТовары.Ссылка = &Ссылка
| И ДокТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
|
|СГРУППИРОВАТЬ ПО
| ДокТовары.Номенклатура";
Запрос.Текст = СтрЗаменить(Запрос.Текст, "&ДокументТовары", ИмяТаблицы);
Реализация
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если УУ И ВидОперации = Перечисления.ВидыОпераций.Реализация Тогда
ДвиженияПоОстаткамУпр(Отказ); //остатки
КонецЕсли;
Если БУ Тогда
ДвиженияПоОстаткамБух(Отказ); //рег. бух
КонецЕсли;
Если Не Отказ Тогда
Если УУ Тогда
ДвиженияПоРегистрамУпр(Отказ); //продажи и взаиморасчеты
КонецЕсли;
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.Продажи.Записывать = Истина;
Движения.Взаиморасчеты.Записывать = Истина;
Движения.РегистрБухгалтерииХозрасчетный.Записывать = Истина;
КонецЕсли;
В проц. ДвиженияПоОстаткамБух после запроса и проверки на нехватку.
Если ВидОперации = Перечисления.ВидыОпераций.Реализация Тогда
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Себестоимость;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.Товары;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Товары] = ВыборкаТовары.Номенклатура;
Проводка.КоличествоКт = ВыборкаТовары.Количество;
ИначеЕсли ВидОперации = Перечисления.ВидыОпераций.ВозвратХранимых Тогда
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.ХранениеТМЦ;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Товары] = ВыборкаТовары.Номенклатура;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
Проводка.КоличествоДт = ВыборкаТовары.Количество;
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Не задан вид операции”;
Сообщение.Сообщить();
Возврат;
КонецЕсли;
В ДвиженияПоРегистрамУпр после запроса
Если ВидОперации = Перечисления.ВидыОпераций.Реализация Тогда
Движения.Продажи.Загрузить(Результат.Выгрузить());
ИначеЕсли ВидОперации = Перечисления.ВидыОпераций.ВозвратХранимых Тогда
Проводка = Движения.Продажи.Добавить();
Проводка.Период = Дата;
Проводка.Регистратор = Ссылка;
Проводка.Контрагент = Контрагент;
Проводка.Менеджер = Менеджер;
Проводка.Номенклатура = Справочники.Номенклатура.УслугиХранения;
Проводка.Сумма = СуммаДокумента;
КонецЕсли;
Авизо. Я думал не справлюсь.
Мод. формы.
&НаКлиенте
Процедура СчетПриИзменении(Элемент)
СчетПриИзмененииНаСервере();
КонецПроцедуры
//
//
// Параметры
// – –
//
// – –
//
//
&НаСервере
Процедура СчетПриИзмененииНаСервере()
Для я=1 по 2 Цикл
если я 0) Тогда
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.Подразделение = Отправитель;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения] = Получатель;
Проводка.СчетКт = Счет;
я=1;
Для каждого СтрокаСубконто Из Счет.ВидыСубконто Цикл
Проводка.СубконтоКт[СтрокаСубконто.ВидСубконто] = ЭтотОбъект[“Субконто”+я];
я=я+1;
КонецЦикла;
Проводка.Сумма = Сумма;
Если Счет.Количественный Тогда
Проводка.КоличествоКт = Количество;
КонецЕсли;
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.Подразделение = Получатель;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения] = Отправитель;
Проводка.СчетДт = Счет;
я=1;
Для каждого СтрокаСубконто Из Счет.ВидыСубконто Цикл
Проводка.СубконтоДт[СтрокаСубконто.ВидСубконто] = ЭтотОбъект[“Субконто”+я];
я=я+1;
КонецЦикла;
//Проводка.СубконтоКт = Субконто1;
Проводка.Сумма = Сумма;
Если Счет.Количественный Тогда
Проводка.КоличествоДт = Количество;
КонецЕсли;
Иначе
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.Подразделение = Отправитель;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения] = Получатель;
Проводка.СчетДт = Счет;
я=1;
Для каждого СтрокаСубконто Из Счет.ВидыСубконто Цикл
Проводка.СубконтоДт[СтрокаСубконто.ВидСубконто] = ЭтотОбъект[“Субконто”+я];
я=я+1;
КонецЦикла;
Проводка.Сумма = Сумма;
Если Счет.Количественный Тогда
Проводка.КоличествоДт = Количество;
КонецЕсли;
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.Подразделение = Получатель;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения] = Отправитель;
Проводка.СчетКт = Счет;
я=1;
Для каждого СтрокаСубконто Из Счет.ВидыСубконто Цикл
Проводка.СубконтоКт[СтрокаСубконто.ВидСубконто] = ЭтотОбъект[“Субконто”+я];
я=я+1;
КонецЦикла;
//Проводка.СубконтоКт = Субконто1;
Проводка.Сумма = Сумма;
Если Счет.Количественный Тогда
Проводка.КоличествоКт = Количество;
КонецЕсли;
КонецЕсли;
Если Не отказ Тогда
Движения.РегистрБухгалтерииХозрасчетный.Записывать = Истина;
КонецЕсли;
КонецПроцедуры
Отчеты
ОСВ по счету
Запрос к РегистрБухгалтерииХозрасчетныйОстаткиИОбороты
СКД
Ресурсы:
СуммаНачальныйОстатокДт
СуммаКонечныйОстатокДт
СуммаОборотДт
Аналогично по Кт
D настройках отбор по Счет и Подразделение.
Вкл. в польз. настройки.
Баланс:
ВЫБРАТЬ
РегистрБухгалтерииХозрасчетныйОстатки.Счет,
РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстаток,
ВЫБОР
КОГДА РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстаток > 0
ТОГДА “Актив”
ИНАЧЕ “Пассив”
КОНЕЦ КАК ВидСредств
ИЗ
РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(, НЕ Счет.забалансовый, , ) КАК РегистрБухгалтерииХозрасчетныйОстатки
Отбор по Подразделению (на закладке Отбор в настройках)
Пассив правда с минусом, зато в итогах 0. значит актив равен пассиву, а не как в задании итог равен Пассив+Актив
ОстаткиБУиУУ:
ВЫБРАТЬ
ЕСТЬNULL(ОстаткиНоменклатурыОстатки.Номенклатура, РегистрБухгалтерииХозрасчетныйОстатки.Субконто1) КАК Товар,
РегистрБухгалтерииХозрасчетныйОстатки.КоличествоОстаток КАК КоличествоБУ,
ОстаткиНоменклатурыОстатки.КоличествоОстаток КАК КоличествоУУ
ИЗ
РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки КАК РегистрБухгалтерииХозрасчетныйОстатки
ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки
ПО РегистрБухгалтерииХозрасчетныйОстатки.Субконто1 = ОстаткиНоменклатурыОстатки.Номенклатура
Arbat, отчет принят.
Наисильнейше опоздавший. Так получается, по другому никак.
Не знаю, актуально или не актуально уже сюда писать, но все же:
Задания 12 выполнено. Описание писать не вижу смысла. (решение уже просмотрел, но выполнял сам).
1. Впечатлило сторно! Просто в восторге! (Извините за эмоции). Реализация движения по регистрам с использованием запросов. Очень удобно, уже использую на практике.
2. С регистрами бухгалтерии знаком, затруднеий не возникало
3. Больше информации по СКД. Например, как в рамках одного варианта отчета подготовить макет требуемого мне вида, а не встроенного, с выводом данных различной структуры и т.д. (Не знаю как объяснить. Нетипичные задачи).
Вопросы:
1. Чтобы мне закончить курс с 5-ым потоком, мне достаточно приобрести продление мастер-группы базового курса?
2. Существует ли продвинутый курс более расширенный во временных рамках?
Спасибо за понимание
Все-таки отчеты нужно писать для успешного финала, данный комментарий можно оставить в качестве исключения.
>Не знаю как объяснить. Нетипичные задачи
Их мы рассматриваем в продвинутом курсе.
>Чтобы мне закончить курс с 5-ым потоком, мне достаточно приобрести продление мастер-группы базового курса?
Да, это так. Активировать токен нужно таким образом, чтобы 19 сентября входило в период действия мастер-группы.
>Существует ли продвинутый курс более расширенный во временных рамках?
Нет.
> Все-таки отчеты нужно писать для успешного финала, данный комментарий можно оставить в качестве исключения.
Д/З последнего блока постараюсь описать, плюс с регистрами расчета не знаком
Добрый день.
Добавлен забалансовый счет 002, перечисление ВидыОпераций, реквизиты в доки Поступления и Реализация. С проводками поступления сложностей не возникло, проверка на вид операции и выполнение необходимых проводк. При реализации хранения выполняется списание с 002 счета с проверкой остатков по регистрам бухгалтерии соответсвующего счета, аналитика производится с помощью уже существующего, созданного ранее. Для введения разреза аналитики по подразделениям создан справочник подразделения и измерения в бух.регистре. Добавленно в проводках по БУ заполнение этого реквизита. Создан документ Авизо, его проведение выполняется с корреспонденцией 79 счета. В документе предусмотренна возможность как суммового так и количественного учета. Отчет Оборотно сальдовая ведомость(ОСВ) создан на основе компановки данных, запрос выбирает данные из виртуальной таблицы остаткиИобороты регистра бухгалтерии.
Отчет Баланс построен также на СКД, признак того актив это или пассив получаем из знака суммы проводки, и соответсвенно относим в нужную группировку.
Выгрузка ИБ
Добрый день!
Даю обратную связь по блоку 3.
Особых сложностей при изучении блока не было.
Наибольшие затруднения при изучении вызвал разбор главы 10 – о сторнировании проводок.
Просматривал эту главу несколько раз, чтобы отловить все нюансы.
В главе 11, в уроке “Заполнение курса с помощью подписки на событие «Перед записью»” впервые (и, насколько помню, единственный раз) – встречается работа с подпиской на события.
Хотелось бы более подробно изучить эту тему.
P.S. Я вам уже писал в обсуждении конфигурации просмотра курсов, что зря вы убрали нумерацию уроков.
Вот смотрите – сейчас, чтобы объяснить, о каком уроке идет речь, мне приходится давать название урока. С номером урока, по-моему, было бы удобнее.
О подписках на событие мы подробно говорим в продвинутом курсе.
По поводу нумерации уроков, все-таки кажется, что название урока указывать лучше, чем его номер, это более информативно.
ДЗ 12
1. ДокументПоступление:
<code>
Функция ПолучитьДанныеПоТМЦДокумента(Ссылка,ВидОперации, Дата, КорСчет, КорСубконто = Неопределено) Экспорт
ИмяТаблицы = “Документ.”+Ссылка.Метаданные().Имя+”.Товары”;
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| &Период,
| ДокТовары.Номенклатура КАК СубконтоДт1,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары) КАК ВидСубконтоДт1,
| &Контрагент КАК СубконтоДт2,
| &ВидСубконтоДт2 КАК ВидСубконтоДт2,
| &Счет КАК СчетДт,
| СУММА(ДокТовары.Количество) КАК КоличествоДт,
| &КорСчет КАК СчетКт,
| &КорСубконто КАК СубконтоКт1,
| &КорВидСубконто КАК ВидСубконтоКт1,
| СУММА(ДокТовары.Сумма) КАК Сумма
|ИЗ
| &ДокументТовары КАК ДокТовары
|ГДЕ
| ДокТовары.Ссылка = &Ссылка
| И ДокТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
|
|СГРУППИРОВАТЬ ПО
| ДокТовары.Номенклатура”;
Запрос.Текст = СтрЗаменить(Запрос.Текст, “&ДокументТовары”, ИмяТаблицы);
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Период”, Дата);
Запрос.УстановитьПараметр(“КорСчет”, КорСчет);
Если КорСубконто = Неопределено Тогда
КорВидСубконто = ПланыВидовХарактеристик.ВидыСубконто.ПустаяСсылка();
Иначе
КорВидСубконто = ПланыВидовХарактеристик.ВидыСубконто.Контрагенты;
КонецЕсли;
если ВидОперации=(Перечисления.ВидПоступления.ПриемНаХранение) тогда
Запрос.УстановитьПараметр(“КорВидСубконто”, ПланыВидовХарактеристик.ВидыСубконто.ПустаяСсылка());
Запрос.УстановитьПараметр(“ВидСубконтоДт2”, ПланыВидовХарактеристик.ВидыСубконто.Контрагенты);
Запрос.УстановитьПараметр(“КорСубконто”, Неопределено);
Запрос.УстановитьПараметр(“Счет”, ПланыСчетов.Хозрасчетный.ТмцПринятыеНаХранения);
Запрос.УстановитьПараметр(“КорСчет”, Неопределено);
Запрос.УстановитьПараметр(“Контрагент”, КорСубконто);
иначе
Запрос.УстановитьПараметр(“Счет”,ПланыСчетов.Хозрасчетный.Товары);
Запрос.УстановитьПараметр(“КорВидСубконто”, КорВидСубконто);
Запрос.УстановитьПараметр(“КорСубконто”, КорСубконто);
Запрос.УстановитьПараметр(“Контрагент”, Неопределено);
Запрос.УстановитьПараметр(“ВидСубконтоДт2”, ПланыВидовХарактеристик.ВидыСубконто.ПустаяСсылка());
конецЕсли;
Возврат Запрос.Выполнить();
КонецФункции
</code>
2. Документ «Реализация» – проведение по БУ
<code>
Движения.РегистрБухгалтерииХозрасчетный.Записать();
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Количество,
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстаток, 0) КАК СуммаОстаток
|ИЗ
| (ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество) КАК Количество
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура) КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(
| &МоментВремени,
| Счет = &Счет,
| ,
| &УсловиеСубконто В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТовары.Номенклатура
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга))) КАК РегистрБухгалтерииХозрасчетныйОстатки
| ПО Товары.Номенклатура = &условиеСоединения”;
Запрос.УстановитьПараметр(“МоментВремени”, МоментВремени());
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
ОперацияХранения=Ложь;
если ссылка.ВидОперации=Перечисления.ВидРеализации.ВозвратСХранения тогда
Запрос.УстановитьПараметр(“Счет”, ПланыСчетов.Хозрасчетный.ТмцПринятыеНаХранения);
ОперацияХранения=Истина;
Запрос.Текст = СтрЗаменить(Запрос.Текст, “&УсловиеСубконто”, “Субконто1=&Субконто1 И Субконто2”);
Запрос.УстановитьПараметр(“Субконто1”, Контрагент);
Запрос.Текст = СтрЗаменить(Запрос.Текст, “&условиеСоединения”, “РегистрБухгалтерииХозрасчетныйОстатки.Субконто2”);
иначе
Запрос.Текст = СтрЗаменить(Запрос.Текст, “&УсловиеСубконто”, “Субконто1”);
Запрос.УстановитьПараметр(“Счет”, ПланыСчетов.Хозрасчетный.Товары);
Запрос.Текст = СтрЗаменить(Запрос.Текст, “&условиеСоединения”, “РегистрБухгалтерииХозрасчетныйОстатки.Субконто1”);
конецЕсли;
Результат = Запрос.Выполнить();
ВыборкаТовары= Результат.Выбрать();
себестоимость=0;
Пока ВыборкаТовары.Следующий() Цикл
Нехватка = ВыборкаТовары.Количество – ВыборкаТовары.КоличествоОстаток;
Если Нехватка>0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Нехватка товара “+ВыборкаТовары.Номенклатура+” составляет “+Нехватка+” единиц”;
Сообщение.Сообщить();
КонецЕсли;
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
если ОперацияХранения тогда
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.ТмцПринятыеНаХранения;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты]=Контрагент ;
иначе
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.Товары;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Себестоимость;
конецЕсли;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Товары] = ВыборкаТовары.Номенклатура;
Проводка.КоличествоКт = ВыборкаТовары.Количество;
Если ВыборкаТовары.КоличествоОстаток = 0 Тогда
Проводка.Сумма = ВыборкаТовары.СуммаОстаток;
Иначе
Проводка.Сумма = ВыборкаТовары.Количество*ВыборкаТовары.СуммаОстаток/ВыборкаТовары.КоличествоОстаток;
КонецЕсли;
себестоимость=себестоимость+ Проводка.Сумма;
КонецЦикла;
</code>
3. Документ Авизо
<code>
&НаКлиенте
Процедура СчетОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
Элементы.Субконто1.Доступность = Ложь;
Элементы.Субконто2.Доступность = Ложь;
Элементы.Количество.Доступность = Ложь;
Структура = Новый Структура;
Структура = АнализСчета(ВыбранноеЗначение);
СтандартнаяОбработка = Структура.ЗапретИспользования;
Если НЕ СтандартнаяОбработка Тогда
Предупреждение(“Нельзя использовать в проводках счета “+СокрЛП(ВыбранноеЗначение));
Возврат;
КонецЕсли;
если структура.Свойство(“ТипСубконто1”) тогда
Элементы.Субконто1.Доступность = Истина;
Элементы.Субконто1.ОграничениеТипа = Структура.ТипСубконто1;
Элементы.Субконто1.ВыбиратьТип = Ложь;
если структура.Свойство(“ТипСубконто2”) тогда
Элементы.Субконто2.Доступность = Истина;
Элементы.Субконто2.ОграничениеТипа = Структура.ТипСубконто2;
Элементы.Субконто2.ВыбиратьТип = Ложь;
конецЕсли;
КонецЕсли;
Если Структура.Количественный Тогда
Элементы.Количество.Доступность = Истина;
КонецЕсли;
КонецПроцедуры
КонецПроцедуры
&НаСервереБезКонтекста
Функция АнализСчета(Счет)
СтруктураСчет = Новый Структура;
КолСубконто = Счет.ВидыСубконто.Количество();
СтруктураСчет.Вставить(“ЗапретИспользования”, не( Счет.ЗапретитьИспользоватьВПроводках или Счет.Забалансовый));
СтруктураСчет.Вставить(“КолСубконто”, КолСубконто);
СтруктураСчет.Вставить(“Количественный”, Счет.Количественный);
для Номер=1 по КолСубконто Цикл
СтруктураСчет.Вставить(“ТипСубконто”+Номер, Новый ОписаниеТипов(Счет.ВидыСубконто.Получить(Номер-1).ВидСубконто.ТипЗначения.Типы()));
КонецЦикла;
Возврат СтруктураСчет;
КонецФункции
</code>
Проведение документа «Авизо»
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстаток, 0) КАК Сумма,
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.КоличествоОстаток, 0) КАК Колво,
| РегистрБухгалтерииХозрасчетныйОстатки.Счет
|ИЗ
| РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(
| &Момент,
| Счет = &СЧет,
| ,
| Подразделения = &Подразделение
| условие
| ) КАК РегистрБухгалтерииХозрасчетныйОстатки”;
Запрос.УстановитьПараметр(“Момент”, Дата);
если ЗначениеЗаполнено(Субконто2) тогда
Запрос.Текст=СтрЗаменить(Запрос.Текст,”условие”,”И Субконто1 = &Субконто1 И Субконто2 = &Субконто2″);
иначеесли ЗначениеЗаполнено(Субконто1) тогда
Запрос.Текст=СтрЗаменить(Запрос.Текст,”условие”,”И Субконто1 = &Субконто1″);
иначе
Запрос.Текст=СтрЗаменить(Запрос.Текст,”условие”,””);
конецЕсли;
Запрос.УстановитьПараметр(“Субконто1”, Субконто1);
Запрос.УстановитьПараметр(“Субконто2”, Субконто2);
Запрос.УстановитьПараметр(“СЧет”, СЧет);
Запрос.УстановитьПараметр(“Подразделение”, ПодразделениеОтправитель);
СообщениеОшибка=””;
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
если ВыборкаДетальныеЗаписи.Следующий() тогда
если счет.Количественный и ВыборкаДетальныеЗаписи.Количество()< Количество тогда
СообщениеОшибка=”Не хватает Количество!”;
отказ=истина;
конецЕсли;
Если ВыборкаДетальныеЗаписи.сумма<Сумма тогда
СообщениеОшибка=”Не хватает Сумма!”;
отказ=истина;
конецЕсли;
иначе
СообщениеОшибка=”не хватает ресурсов!”;
отказ=Истина;
конецЕсли;
если отказ тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = СообщениеОшибка;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Возврат
конецЕсли;
ПроводкаПолучатель=Движения.РегистрБухгалтерииХозрасчетный.Добавить();
ПроводкаОтправитель=Движения.РегистрБухгалтерииХозрасчетный.Добавить();
ПроводкаПолучатель.Период=Дата;
ПроводкаОтправитель.Период=Дата;
ПроводкаПолучатель.СчетДт=СЧет;
ПроводкаОтправитель.СчетКт=СЧет;
если ЗначениеЗаполнено(Субконто1) тогда
ПроводкаПолучатель.СубконтоДт[счет.ВидыСубконто.Получить(0).ВидСубконто]=субконто1;
ПроводкаОтправитель.СубконтоКт[счет.ВидыСубконто.Получить(0).ВидСубконто]=субконто1;
если ЗначениеЗаполнено(Субконто2) тогда
ПроводкаПолучатель.СубконтоДт[счет.ВидыСубконто.Получить(1).ВидСубконто]=субконто2;
ПроводкаОтправитель.СубконтоКт[счет.ВидыСубконто.Получить(1).ВидСубконто]=субконто2;
конецЕсли;
конецЕсли;
если ЗначениеЗаполнено(Количество)тогда
ПроводкаПолучатель.КоличествоДт=Количество;
ПроводкаОтправитель.КоличествоКт=Количество;
конецЕсли;
ПроводкаПолучатель.Подразделения=ПодразделениеПолучатель;
ПроводкаОтправитель.Подразделения=ПодразделениеОтправитель;
если счет.Вид=ВидСчета.Активный тогда
ПроводкаПолучатель.СчетКт=ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
ПроводкаОтправитель.СчетДт=ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
ПроводкаПолучатель.субконтоКТ[ПланыВидовХарактеристик.ВидыСубконто.Подразделения]=ПодразделениеПолучатель;
ПроводкаОтправитель.субконтоДТ[ПланыВидовХарактеристик.ВидыСубконто.Подразделения]=ПодразделениеОтправитель;
ПроводкаПолучатель.Сумма=Сумма;
ПроводкаОтправитель.Сумма=Сумма;
иначе
ПроводкаПолучатель.субконтоДТ[ПланыВидовХарактеристик.ВидыСубконто.Подразделения]=ПодразделениеПолучатель;
ПроводкаОтправитель.субконтоКТ[ПланыВидовХарактеристик.ВидыСубконто.Подразделения]=ПодразделениеОтправитель;
ПроводкаОтправитель.СчетКт=ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
ПроводкаПолучатель.СчетДт=ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
ПроводкаПолучатель.Сумма=-Сумма;
ПроводкаОтправитель.Сумма=-Сумма;
конецЕсли;
Движения.РегистрБухгалтерииХозрасчетный.Записывать=Истина;
КонецПроцедуры
</code>
1) Для добавления в план счетов счета 002 «ТМЦпринятые на хранение» изменил маску кода на @@@.@@ и максимальное количество субконто =2. Подправил порядок кода у элементов плана счетов. Указал у 002 признак учета количественный. Добавил Перечисление «ОперацииПоступленияТоваров». В ДокПоступления добавил операцию. В МФ для проверки возможности изменения операции добавил –
<code>
&НаКлиенте
Процедура ОперацияПриИзменении(Элемент)
УстановитьУУБУ();
КонецПроцедуры
&НаСервере
Процедура УстановитьУУБУ()
Если ЗначениеЗаполнено(Объект.Ссылка) И Объект.Проведен Тогда
//(не новый документ) и (уже проведен)
Объект.Операция = Объект.Ссылка.ПолучитьОбъект().Операция;
Сообщить(“В проведенных документах операцию нельзя изменить!”);
//если ничего не меняли – операцию изменили – откатили к старому значению – признак Модифицированность=Истина;
//надо посмотреть как его в этом случае сбросить – вопрос про необходимость обновления только отвлекает
Иначе
Если Объект.Операция = Перечисления.ОперацииПоступленияТоваров.Покупка Тогда
Элементы.УУ.Доступность=Истина;
ИначеЕсли Объект.Операция = Перечисления.ОперацииПоступленияТоваров.Приемнахранение Тогда
Если Объект.УУ Тогда
Объект.УУ = Ложь;
КонецЕсли;
Элементы.УУ.Доступность=Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Операция = Перечисления.ОперацииПоступленияТоваров.Приемнахранение Тогда
Элементы.УУ.Доступность=Ложь;
КонецЕсли;
КонецПроцедуры
</code> В МО ДокПоступления подправил проведение с учетом операции
<code>
Процедура ОбработкаПроведения(Отказ, Режим)
Если Операция = Перечисления.ОперацииПоступленияТоваров.Покупка Тогда
// этот код уже был — проведение в УУ и БУ -не показываю его
КонецЕсли;
Если Операция = Перечисления.ОперацииПоступленияТоваров.Приемнахранение Тогда
Если БУ Тогда
Движения.РегистрБухгалтерии.Записывать = Истина;
Для Каждого ТекСтрокаСтроки Из Строки Цикл
ФлагОбработки =
ТекСтрокаСтроки.Номенклатура.Ссылка.ВидНоменклатуры=Перечисления.ВидНоменклатуры.Товар
ИЛИ
ТекСтрокаСтроки.Номенклатура.Ссылка.ВидНоменклатуры=Перечисления.ВидНоменклатуры.Набор;
Если ФлагОбработки Тогда
ОбработкапроведенияБУ(ТекСтрокаСтроки,”Приемнахранение”);
Иначе
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “В документе Поступления ‘Прием на хранение’ не может быть номенклатуры “+ТекСтрокаСтроки.Номенклатура;
Сообщение.Поле = “Строки[“+(ТекСтрокаСтроки.НомерСтроки-1)+”].Номенклатура”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
КонецЦикла;
Иначе
Отказ = Истина;
Сообщить(“Проведение не возможно. Проведение должно быть хоть в одном УУ или БУ”);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкапроведенияБУ(ТекСтрокаСтроки, Операция)
Если ТипЗнч(Поставщик) = Тип(“СправочникСсылка.Контрагенты”) Тогда
ФлагКонтрагент = Истина;
Иначе
ФлагКонтрагент = Ложь;
КонецЕсли;
//РегистрБухгалтерии
Проводка = Движения.РегистрБухгалтерии.Добавить();
Проводка.Период = Дата;
Если Операция = “Покупка” Тогда
// этот код уже был — проведение в УУ и БУ -не показываю его
КонецЕсли;
Если Операция = “Приемнахранение” Тогда
Проводка.СчетДт = ПланыСчетов.Бухгалтерский.ТМЦпринятыенахранение;
Проводка.СубконтоДт.Номенклатура = ТекСтрокаСтроки.Номенклатура;
Проводка.СубконтоДт.Контрагенты = Поставщик;
Проводка.КоличествоДт = ТекСтрокаСтроки.Колво*ТекСтрокаСтроки.КоэфПересчета;
Конецесли;
Проводка.Сумма = ТекСтрокаСтроки.Сумма;
КонецПроцедуры
</code> 1) Добавил Перечисление «ОперацииРеализацииТоваров». В ДокРеализации добавил операцию. В МФ для проверки возможности изменения операции добавил –
<code>
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Если Объект.Операция = Перечисления.ОперацииРеализацииТоваров.Возвратсхранения Тогда
Элементы.УУ.Доступность=Ложь;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура ОперацияПриИзменении(Элемент)
УстановитьУУБУ();
КонецПроцедуры
&НаСервере
Процедура УстановитьУУБУ()
Если ЗначениеЗаполнено(Объект.Ссылка) И Объект.Проведен Тогда
Объект.Операция = Объект.Ссылка.ПолучитьОбъект().Операция;
Сообщить(“В проведенных документах операцию нельзя изменить!”);
Иначе
Если Объект.Операция = Перечисления.ОперацииРеализацииТоваров.Реализация Тогда
Элементы.УУ.Доступность=Истина;
ИначеЕсли Объект.Операция = Перечисления.ОперацииРеализацииТоваров.Возвратсхранения Тогда
Элементы.УУ.Доступность=Ложь;
//если проводим в БУ – значит должны провести в РН Продажи на сумму услуг
Объект.УУ=Объект.БУ;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаКлиенте
Процедура БУПриИзменении(Элемент)
Если Объект.Операция = ПолучитьЗначениеСервера(“Перечисления.ОперацииРеализацииТоваров.Возвратсхранения”) И Объект.БУ=Объект.БУ Тогда
//если проводим в БУ – значит должны провести в РН Продажи на сумму услуг
Объект.УУ=Объект.БУ;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьЗначениеСервера(Объектнаименование)
Если Объектнаименование = “Перечисления.ОперацииРеализацииТоваров.Возвратсхранения” Тогда
Возврат Перечисления.ОперацииРеализацииТоваров.Возвратсхранения;
КонецЕсли;
КонецФункции</code> 3)В справочник номенклатуры добавил предопределенный элемент «УслугиОтветственногоХранения». В МО ДокРеализации подправил проведение с учетом операции
<code>
Процедура ОбработкаПроведения(Отказ, Режим)
Если Операция = Перечисления.ОперацииРеализацииТоваров.Реализация Тогда
// этот код уже был — проведение в УУ и БУ -не показываю его. Только оди момент – ОбработкаПроведенияБУ(Отказ, “Реализация”);
КонецЕсли;
Если Операция = Перечисления.ОперацииРеализацииТоваров.Возвратсхранения Тогда
Если БУ Тогда
//на сумму услуг хранения
Движения.Продажи.Записывать = Истина;
Для Каждого ТекСтрокаСтроки Из Строки Цикл
ФлагОбработки =
ТекСтрокаСтроки.Номенклатура.Ссылка.ВидНоменклатуры=Перечисления.ВидНоменклатуры.Товар
ИЛИ
ТекСтрокаСтроки.Номенклатура.Ссылка.ВидНоменклатуры=Перечисления.ВидНоменклатуры.Набор;
Если НЕ ФлагОбработки Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “В документе Поступления ‘Прием на хранение’ не может быть номенклатуры “+ТекСтрокаСтроки.Номенклатура;
Сообщение.Поле = “Строки[“+(ТекСтрокаСтроки.НомерСтроки-1)+”].Номенклатура”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
КонецЦикла;
Если НЕ Отказ Тогда
Движения.Продажи.Записывать = Истина;
ОбработкаПроведенияБУ(Отказ, “Возвратсхранения”);
КонецЕсли;
Иначе
Отказ = Истина;
Сообщить(“Проведение не возможно. Проведение должно быть хоть в одном УУ или БУ”);
КонецЕсли;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроведенияБУ(Отказ, Операция)
Движения.РегистрБухгалтерии.Очистить();
Движения.РегистрБухгалтерии.Записать();
Если Операция = “Реализация” Тогда
// этот код уже был — проведение в УУ и БУ -не показываю его.
КонецЕсли;
Если Операция = “Возвратсхранения” Тогда
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ДокРеализацииСтроки.Номенклатура,
| СУММА(ДокРеализацииСтроки.КоэфПересчета * ДокРеализацииСтроки.Колво) КАК КолДок,
| СУММА(ДокРеализацииСтроки.Сумма) КАК СуммаДок,
| МАКСИМУМ(ДокРеализацииСтроки.НомерСтроки) КАК НомерСтроки,
| ЕСТЬNULL(РегистрБухгалтерииОстатки.КоличествоОстатокДт, 0) КАК КолОст,
| ЕСТЬNULL(РегистрБухгалтерииОстатки.СуммаОстатокДт, 0) КАК СуммаОст,
| &Контрагент
|ИЗ
| Документ.ДокРеализации.Строки КАК ДокРеализацииСтроки
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.РегистрБухгалтерии.Остатки(
| &Момент,
| Счет = &Счет,
| ,
| (Субконто1, Субконто2) В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| ДокРеализацииСтроки.Номенклатура,
| &Контрагент КАК Контрагент
| ИЗ
| Документ.ДокРеализации.Строки КАК ДокРеализацииСтроки
| ГДЕ
| ДокРеализацииСтроки.Ссылка = &Ссылка)) КАК РегистрБухгалтерииОстатки
| ПО ДокРеализацииСтроки.Номенклатура = РегистрБухгалтерииОстатки.Субконто1
|ГДЕ
| ДокРеализацииСтроки.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ДокРеализацииСтроки.Номенклатура,
| ЕСТЬNULL(РегистрБухгалтерииОстатки.КоличествоОстатокДт, 0),
| ЕСТЬNULL(РегистрБухгалтерииОстатки.СуммаОстатокДт, 0)”;
Граница = Новый Граница(КонецДня(Дата),ВидГраницы.Включая);
Запрос.УстановитьПараметр(“Счет”, ПланыСчетов.Бухгалтерский.ТМЦпринятыенахранение);
Запрос.УстановитьПараметр(“Контрагент”, Покупатель);
Запрос.УстановитьПараметр(“Момент”, Граница);
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
СуммаДокумента = 0;
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
Нехватка = ВыборкаДетальныеЗаписи.КолДок – ВыборкаДетальныеЗаписи.КолОст;
Если Нехватка > 0 Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “На остатках в БУ нехватка “+ВыборкаДетальныеЗаписи.Номенклатура+” “+Нехватка;
Сообщение.Поле = “Строки[“+(ВыборкаДетальныеЗаписи.НомерСтроки-1)+”].Колво”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Иначе
Проводка = Движения.РегистрБухгалтерии.Добавить();
Проводка.Период = Дата;
Проводка.СчетКт = ПланыСчетов.Бухгалтерский.ТМЦпринятыенахранение;
Проводка.Субконтокт.Номенклатура = ВыборкаДетальныеЗаписи.Номенклатура;
Проводка.Субконтокт.Контрагенты = Покупатель;
Проводка.КоличествоКт = ВыборкаДетальныеЗаписи.КолДок;
Если ВыборкаДетальныеЗаписи.КолОст = 0 Тогда
Проводка.Сумма = 0;
Иначе
Проводка.Сумма = (ВыборкаДетальныеЗаписи.КолДок*ВыборкаДетальныеЗаписи.СуммаОст)/ВыборкаДетальныеЗаписи.КолОст;
КонецЕсли;
СуммаДокумента = Суммадокумента + ВыборкаДетальныеЗаписи.СуммаДок;
КонецЕсли;
КонецЦикла;
Если НЕ Отказ Тогда
Движения.РегистрБухгалтерии.Записывать = Истина;
Проводка = Движения.РегистрБухгалтерии.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Бухгалтерский.Покупатели;
Проводка.СубконтоДт.Контрагенты = Покупатель;
Проводка.СчетКт = ПланыСчетов.Бухгалтерский.Выручка;
СуммаУслугХранения = Строки.Итог(“Сумма”);
Проводка.Сумма = СуммаУслугХранения;
//и в РН Продажи
ДвижениеПр = Движения.Продажи.Добавить();
ДвижениеПр.Период = Дата;
ДвижениеПр.Контрагент = Покупатель;
ДвижениеПр.Номенклатура = Справочники.Номенклатура.УслугиОтветственногохранения;
ДвижениеПр.Менеджер = Менеджер;
ДвижениеПр.Сумма = СуммаУслугХранения;
ДвижениеПр.Колво = 1;
ДвижениеПр.ЕдИзм = Справочники.Номенклатура.УслугиОтветственногохранения.БазоваяЕдиницаИзмерения;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code> 4)Добавил справочник Организации(не иерархический). В РН и РегистрБухгалтерии добавил Измерение — Организация. Подправил Формы документов и процедуры проведения. Запрос по остаткам модернизирован добавлением строк (проведение в УУ) –
<code>
… РегистрНакопления.ОстаткиТоваров.Остатки( &Момент, (Номенклатура, Организация) В ….
…ВЫБРАТЬ РАЗЛИЧНЫЕ ДокРеализацииСтроки.Номенклатура, &Организация КАК Организация …
</code>
А запрос по остаткам модернизирован добавлением строк (проведение в БУ) –
<code>
Запрос по остаткам модернизирован добавлением строк (провдение в УУ) –
<code>
…РегистрБухгалтерии.РегистрБухгалтерии.Остатки(&Момент,Счет = ЗНАЧЕНИЕ(ПланСчетов.Бухгалтерский.Товары),,Субконто1 В …
И Организация = &Организация) КАК РегистрБухгалтерииОстатки </code>
5)Добавил документ Авизо. Для проверки данных добавил процедуру в МО
<code>
Процедура ПередЗаписью(Отказ, РежимЗаписи, РежимПроведения)
Если ОрганизацияОтправитель = ОрганизацияПолучатель Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Организации должны быть разными”;
Сообщение.Поле = “ОрганизацияПолучатель”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Иначе
ФлагСчетГруппа = ПроверкаНаПотомков();
Если НЕ ФлагСчетГруппа Тогда
Отказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Этот счет выбрать нельзя, это счет-группа”;
Сообщение.Поле = “СчетУчета”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Конецесли;
КонецЕсли
КонецПроцедуры
Функция ПроверкаНаПотомков()
СчетДтКт = СчетУчета;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ ПЕРВЫЕ 1
| Бухгалтерский.Ссылка
|ИЗ
| ПланСчетов.Бухгалтерский КАК Бухгалтерский
|ГДЕ
| Бухгалтерский.Родитель = &Родитель”;
Запрос.УстановитьПараметр(“Родитель”, СчетДтКт);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
КолЗап=ВыборкаДетальныеЗаписи.Количество();
Если КолЗап > 0 Тогда
Возврат Ложь;
Иначе
Возврат Истина;
КонецЕсли
КонецФункции
</code>
В форме докумнта свойство реквизитов субконто «Выбирать Тип» не установлено. И в МФ –
<code>
&НаКлиенте
Процедура СчетУчетаПриИзменении(Элемент)
КонецПроцедуры
&НаСервере
Функция ПроверкаНаПотомков()
КонецФункции
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ПроверкаНаСубконто(Объект.СчетУчета);
КонецПроцедуры
&НаСервере
Процедура ПроверкаНаСубконто(СчетУчета)
Если СчетУчета.Количественный Тогда
Элементы.Количество.Видимость = Истина;
Иначе
Элементы.Количество.Видимость = Ложь;
КонецЕсли;
КоличествоИх = СчетУчета.ВидыСубконто.Количество();
Если КоличествоИх = 0 Тогда
Элементы.Субконто1.Видимость = Ложь;
Элементы.Субконто2.Видимость = Ложь;
Иначе
Если ЗначениеЗаполнено(СчетУчета.ВидыСубконто[0].ВидСубконто) Тогда
Элементы.Субконто1.Видимость = Истина;
//как-то не получилось значение присвоить как-то по другому — см буду решение
Объект.Субконто1 = ОпределитьСубконто(СчетУчета.ВидыСубконто[0].ВидСубконто.Наименование, Объект.Субконто1);
Если КоличествоИх = 2 И ЗначениеЗаполнено(СчетУчета.ВидыСубконто[1].ВидСубконто) Тогда
Элементы.Субконто2.Видимость = Истина;
//как-то не получилось значение присвоить как-то по другому — см буду решение
Объект.Субконто2 = ОпределитьСубконто(СчетУчета.ВидыСубконто[1].ВидСубконто.Наименование, Объект.Субконто2);
Иначе
Элементы.Субконто2.Видимость = Ложь;
КонецЕсли;
Иначе
Элементы.Субконто1.Видимость = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ОпределитьСубконто(СубконтоНаименование, СубконтоЗначение)
Если СубконтоНаименование = “Контрагенты” Тогда
ПустаяСсылка=Справочники.Контрагенты.ПустаяСсылка();
Если ТипЗнч(СубконтоЗначение)<>Тип(“СправочникСсылка.Контрагенты”) Тогда
Возврат ПустаяСсылка;
Иначе
Если ЗначениеЗаполнено(СубконтоЗначение) Тогда
Возврат СубконтоЗначение;
Иначе
Возврат ПустаяСсылка;
КонецЕсли;
КонецЕсли;
ИначеЕсли СубконтоНаименование = “Номенклатура” Тогда
ПустаяСсылка=Справочники.Номенклатура.ПустаяСсылка();
Если ТипЗнч(СубконтоЗначение)<>Тип(“СправочникСсылка.Номенклатура”) Тогда
Возврат ПустаяСсылка;
Иначе
Если ЗначениеЗаполнено(СубконтоЗначение) Тогда
Возврат СубконтоЗначение;
Иначе
Возврат ПустаяСсылка;
КонецЕсли;
КонецЕсли;
ИначеЕсли СубконтоНаименование = “Сотрудники” Тогда
ПустаяСсылка=Справочники.СотрудникиОрганизации.ПустаяСсылка();
Если ТипЗнч(СубконтоЗначение)<>Тип(“СправочникСсылка.Сотрудники”) Тогда
Возврат ПустаяСсылка;
Иначе
Если ЗначениеЗаполнено(СубконтоЗначение) Тогда
Возврат СубконтоЗначение;
Иначе
Возврат ПустаяСсылка;
КонецЕсли;
КонецЕсли;
КонецЕсли;
КонецФункции
</code>
Добавил ВидСубконто – «Организации». Добавил счет 79 с видом субконто «Организации», счет признаком учета — количественый. И в МО добавил процедуру проведения –
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ФлагДанныеОтказ = Ложь;
Если ЗначениеЗаполнено(СчетУчета) Тогда
//проверю заполнение субсчетов
КоличествоИх = СчетУчета.ВидыСубконто.Количество();
КоличествоИх = КоличествоИх – 1;
Для ТекСубсчет=0 По КоличествоИх Цикл
Если НЕ ЗначениеЗаполнено(СчетУчета.ВидыСубконто[ТекСубсчет].ВидСубконто) Тогда
ФлагДанныеОтказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Субсчет счета учета должен быть заполнен!”;
Сообщение.Поле = ПоискРеквизитаСубсчета(ТекСубсчет, “Наименование”);
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
КонецЦикла;
Иначе
ФлагДанныеОтказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Счет учета должен быть заполнен!”;
Сообщение.Поле = “СчетУчета”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
Если НЕ ЗначениеЗаполнено(Сумма) Тогда
ФлагДанныеОтказ = Истина;
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Сумма должна быть не равной 0!”;
Сообщение.Поле = “Сумма”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЕсли;
Если ФлагДанныеОтказ Тогда
Отказ = Истина;
Иначе
Если СчетУчета.Количественный И НЕ ЗначениеЗаполнено(Количество) Тогда
Количество = 0;
КонецЕсли;
//РегистрБухгалтерии
Движения.РегистрБухгалтерии.Записывать = Истина;
//1я
Проводка = Движения.РегистрБухгалтерии.Добавить();
Проводка.Период = Дата;
Если СчетУчета.Вид = ВидСчета.Активный ИЛИ (СчетУчета.Вид = ВидСчета.АктивноПассивный И Сумма > 0) Тогда
Проводка.Организация = ОрганизацияОтправитель;
Иначе
Проводка.Организация = ОрганизацияПолучатель;
КонецЕсли;
Проводка.СчетДт = ПланыСчетов.Бухгалтерский.Обособленныеподразделения;
Если СчетУчета.Вид = ВидСчета.Активный ИЛИ (СчетУчета.Вид = ВидСчета.АктивноПассивный И Сумма > 0) Тогда
Проводка.СубконтоДт.Организации = ОрганизацияПолучатель;
Иначе
Проводка.СубконтоДт.Организации = ОрганизацияОтправитель;
КонецЕсли;
Проводка.КоличествоДт = Количество;
Проводка.СчетКт = СчетУчета;
Для ТекСубсчет=0 По КоличествоИх Цикл
ОпределитьСубконто(Проводка, СчетУчета.ВидыСубконто[ТекСубсчет].ВидСубконто.Наименование, ТекСубсчет, “Кт”);
КонецЦикла;
Проводка.Сумма = Сумма;
Если СчетУчета.Количественный Тогда
Проводка.КоличествоКт = Количество;
КонецЕсли;
//2я
Проводка = Движения.РегистрБухгалтерии.Добавить();
Проводка.Период = Дата;
Если СчетУчета.Вид = ВидСчета.Активный ИЛИ (СчетУчета.Вид = ВидСчета.АктивноПассивный И Сумма > 0) Тогда
Проводка.Организация = Организацияполучатель;
Иначе
Проводка.Организация = ОрганизацияОтправитель;
КонецЕсли;
Проводка.СчетДт = СчетУчета;
Для ТекСубсчет=0 По КоличествоИх Цикл
ОпределитьСубконто(Проводка, СчетУчета.ВидыСубконто[ТекСубсчет].ВидСубконто.Наименование, ТекСубсчет, “Дт”);
КонецЦикла;
Если СчетУчета.Количественный Тогда
Проводка.КоличествоДт = Количество;
КонецЕсли;
Проводка.СчетКт = ПланыСчетов.Бухгалтерский.Обособленныеподразделения;
Если СчетУчета.Вид = ВидСчета.Активный ИЛИ (СчетУчета.Вид = ВидСчета.АктивноПассивный И Сумма > 0) Тогда
Проводка.СубконтоКт.Организации = ОрганизацияОтправитель;
Иначе
Проводка.СубконтоКт.Организации = ОрганизацияПолучатель;
КонецЕсли;
Проводка.Сумма = Сумма;
Проводка.КоличествоКт = Количество;
КонецЕсли;
КонецПроцедуры
Функция ПоискРеквизитаСубсчета(НомПозСубсчета, ВариантВозврата)
Если НомПозСубсчета = 0 Тогда
Если ВариантВозврата = “Наименование” Тогда
Возврат “Субконто1”;
Иначе
Возврат Субконто1;
КонецЕсли;
ИначеЕсли НомПозСубсчета = 1 Тогда
Если ВариантВозврата = “Наименование” Тогда
Возврат “Субконто2”;
Иначе
Возврат Субконто2;
КонецЕсли;
КонецЕсли;
КонецФункции
Функция ОпределитьСубконто(Проводка, СубконтоНаименование, НомПозСубсчета, КтДт)
Если СубконтоНаименование = “Контрагенты” Тогда
Если КтДт=”Кт” Тогда
Проводка.СубконтоКт.Контрагенты = ПоискРеквизитаСубсчета(НомПозСубсчета, “Значение”);
Иначе
Проводка.СубконтоДт.Контрагенты = ПоискРеквизитаСубсчета(НомПозСубсчета, “Значение”);
КонецЕсли;
ИначеЕсли СубконтоНаименование = “Номенклатура” Тогда
Если КтДт=”Кт” Тогда
Проводка.СубконтоКт.Номенклатура = ПоискРеквизитаСубсчета(НомПозСубсчета, “Значение”);
Иначе
Проводка.СубконтоДт.Номенклатура = ПоискРеквизитаСубсчета(НомПозСубсчета, “Значение”);
КонецЕсли;
ИначеЕсли СубконтоНаименование = “Сотрудники” Тогда
Если КтДт=”Кт” Тогда
Проводка.СубконтоКт.Сотрудники = ПоискРеквизитаСубсчета(НомПозСубсчета, “Значение”);
Иначе
Проводка.СубконтоДт.Сотрудники = ПоискРеквизитаСубсчета(НомПозСубсчета, “Значение”);
КонецЕсли;
КонецЕсли;
КонецФункции
</code> 6) Отчет ОСВ все как в уроке, добавил только в параметрах виртуальной таблице условие на организацию(аналогично счету), и добавил в отбор. 7) Отчет Баланс все как в уроке, только добавил в параметрах ВТ условие (НЕ Счет.Забалансовый), а в компоновке данных добавил в параметрах ВТ условие (Организация)
8)При разработке оОтчета Остатки УУ и БУ основная трудность была в создании запроса(В УУ нет Организаций). Поискал ошибки в документах.
<code>
ВЫБРАТЬ
ОстаткиТоваровОстатки.Номенклатура,
ОстаткиТоваровОстатки.КолвоОстаток,
“ОстаткиУУ” КАК Раздел
ИЗ
РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
РегистрБухгалтерииОстатки.Субконто1,
СУММА(РегистрБухгалтерииОстатки.КоличествоОстаток),
“ОстаткиБУ”
ИЗ
РегистрБухгалтерии.РегистрБухгалтерии.Остатки(, , &Номенклатура, ) КАК РегистрБухгалтерииОстатки
ГДЕ
(НЕ РегистрБухгалтерииОстатки.Субконто1.ВидНоменклатуры = &Услуги)
И (НЕ РегистрБухгалтерииОстатки.Счет.Забалансовый)
СГРУППИРОВАТЬ ПО
РегистрБухгалтерииОстатки.Субконто1
</code>
Ответы
1 Сторнирование документов в РС.
2 Затруднения помогает преодолеть повторный просмотр уроков.
3 Наверное это уже будут темы которые пока обозначаются как – «А это мы рассмотрим в продвинутом курсе»
Задание выполнено.
1. Поступление товаров, модуль объекта
Процедура СформироватьДвиженияБУ(Запрос)
Если ВидОперации = Перечисления.ВидыОперацийПоступления.Покупка Тогда
Запрос.Текст =
“ВЫБРАТЬ
| втТовары.Период,
| втТовары.Подразделение,
| ВЫБОР
| КОГДА втТовары.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНомерклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Товары)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Затраты)
| КОНЕЦ КАК СчетДт,
| ВЫБОР
| КОГДА втТовары.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНомерклатуры.Услуга)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Номенклатура)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| КОНЕЦ КАК ВидСубконтоДт1,
| ВЫБОР
| КОГДА втТовары.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНомерклатуры.Услуга)
| ТОГДА втТовары.Номенклатура
| ИНАЧЕ НЕОПРЕДЕЛЕНО
| КОНЕЦ КАК СубконтоДт1,
| ВЫБОР
| КОГДА втТовары.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНомерклатуры.Услуга)
| ТОГДА втТовары.Количество
| ИНАЧЕ 0
| КОНЕЦ КАК КоличествоДт,
| ЗНАЧЕНИЕ(ПланСчетов.Управленческий.Поставщики) КАК СчетКт,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты) КАК ВидСубконтоКт1,
| втТовары.Контрагент КАК СубконтоКт1,
| втТовары.Стоимость КАК Сумма
|ИЗ
| втТовары КАК втТовары”;
Иначе
Запрос.Текст =
“ВЫБРАТЬ
| втТовары.Период,
| втТовары.Подразделение,
| ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ТМЦПринятыеНаХранение) КАК СчетДт,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Номенклатура) КАК ВидСубконтоДт1,
| втТовары.Номенклатура КАК СубконтоДт1,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты) КАК ВидСубконтоДт2,
| втТовары.Контрагент КАК СубконтоДт2,
| втТовары.Количество КАК КоличествоДт,
| втТовары.Стоимость КАК Сумма
|ИЗ
| втТовары КАК втТовары”;
КонецЕсли;
Движения.Управленческий.Загрузить(Запрос.Выполнить().Выгрузить());
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, Режим)
МетаданныеДвижения = ЭтотОбъект.Метаданные().Движения;
Для каждого Строка Из МетаданныеДвижения Цикл
Движения[Строка.Имя].Записывать = Истина;
КонецЦикла;
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Период”, Дата);
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Запрос.УстановитьПараметр(“Подразделение”, Подразделение);
Запрос.Текст =
“ВЫБРАТЬ
| &Период КАК Период,
| &Контрагент КАК Контрагент,
| &Подразделение КАК Подразделение,
| ПоступлениеТоваровТовары.Номенклатура,
| ПоступлениеТоваровТовары.Номенклатура.ВидНоменклатуры КАК ВидНоменклатуры,
| ПоступлениеТоваровТовары.Качество,
| СУММА(ПоступлениеТоваровТовары.Количество * ПоступлениеТоваровТовары.Коэффициент) КАК Количество,
| СУММА(ПоступлениеТоваровТовары.Сумма) КАК Стоимость
|ПОМЕСТИТЬ втТовары
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
|ГДЕ
| ПоступлениеТоваровТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПоступлениеТоваровТовары.Качество,
| ПоступлениеТоваровТовары.Номенклатура,
| ПоступлениеТоваровТовары.Номенклатура.ВидНоменклатуры”;
Запрос.Выполнить();
Если УУ И ВидОперации = Перечисления.ВидыОперацийПоступления.Покупка Тогда
СформироватьДвиженияУУ(Запрос);
КонецЕсли;
Если БУ Тогда
СформироватьДвиженияБУ(Запрос);
КонецЕсли;
КонецПроцедуры
2. Реализация товаров, модуль объекта
Процедура СформироватьДвиженияУУ(Отказ)
Запрос = Новый Запрос;
Запрос.МенеджерВременныхТаблиц = Новый МенеджерВременныхТаблиц;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Период”, Дата);
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Запрос.УстановитьПараметр(“Менеджер”, Менеджер);
Запрос.Текст =
“ВЫБРАТЬ
| &Период КАК Период,
| &Контрагент КАК Контрагент,
| &Менеджер КАК Менеджер,
| РеализацияТоваровТовары.Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.Коэффициент) КАК Количество,
| СУММА(РеализацияТоваровТовары.Сумма) КАК Стоимость
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И &УсловиеУслуга
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура”;
Если ВидОперации = Перечисления.ВидыОперацийРеализация.ВозвратХранения Тогда
УсловиеУслуга = “РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНомерклатуры.Услуга)”;
Иначе
УсловиеУслуга = “ИСТИНА”;
КонецЕсли;
Запрос.Текст = СтрЗаменить(Запрос.Текст,”&УсловиеУслуга”,УсловиеУслуга);
Движения.Продажи.Загрузить(Запрос.Выполнить().Выгрузить());
Если ВидОперации = Перечисления.ВидыОперацийРеализация.Реализация Тогда
…..
КонецЕсли;
КонецПроцедуры
Процедура СформироватьДвиженияБУ(Отказ)
Движения.Управленческий.Записать();
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.Коэффициент) КАК Количество
|ПОМЕСТИТЬ втТовары
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНомерклатуры.Услуга)
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| втТовары.Номенклатура,
| втТовары.Количество,
| ЕСТЬNULL(Остатки.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ЕСТЬNULL(Остатки.СуммаОстаток, 0) КАК СуммаОстаток
|ИЗ
| втТовары КАК втТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки(
| &Момент,
| Счет = &СчетТМЦ,
| ,
| Субконто1 В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| втТовары.Номенклатура
| ИЗ
| втТовары КАК втТовары)
| И &УсловиеКонтрагент) КАК Остатки
| ПО втТовары.Номенклатура = Остатки.Субконто1”;
Если ВидОперации = Перечисления.ВидыОперацийРеализация.ВозвратХранения Тогда
СчетТМЦ = ПланыСчетов.Управленческий.ТМЦПринятыеНаХранение;
УсловиеКонтрагент = “Субконто2 = &Контрагент”;
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Иначе
СчетТМЦ = ПланыСчетов.Управленческий.Товары;
УсловиеКонтрагент = “ИСТИНА”;
КонецЕсли;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Момент”, МоментВремени());
Запрос.УстановитьПараметр(“СчетТМЦ”, СчетТМЦ);
Запрос.Текст = СтрЗаменить(Запрос.Текст,”&УсловиеКонтрагент”,УсловиеКонтрагент);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Нехватка = Выборка.Количество – Макс(Выборка.КоличествоОстаток,-Выборка.КоличествоОстаток);
Если Нехватка > 0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “При списании “+Выборка.Номенклатура+” превышен остаток на “+Нехватка+” ед.”;
Сообщение.Сообщить();
Если ВидОперации = Перечисления.ВидыОперацийРеализация.ВозвратХранения Тогда
Отказ = Истина;
Продолжить;
КонецЕсли;
КонецЕсли;
Движение = Движения.Управленческий.Добавить();
Движение.Период = Дата;
Движение.Подразделение = Подразделение;
Если ВидОперации = Перечисления.ВидыОперацийРеализация.ВозвратХранения Тогда
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
Иначе
Движение.СчетДт = ПланыСчетов.Управленческий.Себестоимость;
КонецЕсли;
Движение.СчетКт = СчетТМЦ;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура;
Движение.КоличествоКт = Выборка.Количество;
Если Нехватка = 0 ИЛИ Выборка.КоличествоОстаток = 0 Тогда
Движение.Сумма = Выборка.СуммаОстаток;
Иначе
Движение.Сумма = Выборка.Количество * Выборка.СуммаОстаток / Выборка.КоличествоОстаток;
КонецЕсли;
КонецЦикла;
Если ВидОперации = Перечисления.ВидыОперацийРеализация.ВозвратХранения Тогда
СуммаПроводки = 0;
Для каждого Строка Из Товары Цикл
Если Строка.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНомерклатуры.Услуга Тогда
СуммаПроводки = СуммаПроводки + Строка.Сумма;
КонецЕсли;
КонецЦикла;
Иначе
СуммаПроводки = СуммаДокумента;
КонецЕсли;
Движение = Движения.Управленческий.Добавить();
Движение.Период = Дата;
Движение.Подразделение = Подразделение;
Движение.СчетДт = ПланыСчетов.Управленческий.Покупатели;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
Движение.СчетКт = ПланыСчетов.Управленческий.Выручка;
Движение.Сумма = СуммаПроводки;
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
МетаданныеДвижения = ЭтотОбъект.Метаданные().Движения;
Для каждого Строка Из МетаданныеДвижения Цикл
Движения[Строка.Имя].Записывать = Истина;
КонецЦикла;
Если УУ Тогда
СформироватьДвиженияУУ(Отказ);
КонецЕсли;
Если БУ И НЕ Отказ Тогда
СформироватьДвиженияБУ(Отказ);
КонецЕсли;
КонецПроцедуры
3. Авизо, модуль объекта
Процедура УстановитьСубконто(Субконто)
ВидыСубконтоСчета = Счет.ВидыСубконто;
КоличествоСубконто = ВидыСубконтоСчета.Количество();
Для НомерСубконто = 1 По КоличествоСубконто Цикл
ВидСубк = ВидыСубконтоСчета[НомерСубконто – 1].ВидСубконто;
ЗначениеСубконто = ЭтотОбъект[“Субконто”+НомерСубконто];
Если ВидСубк.ТипЗначения.СодержитТип(ТипЗнч(ЗначениеСубконто)) Тогда
Субконто.Вставить(ВидСубк, ЗначениеСубконто);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Управленческий.Записывать = Истина;
Если Счет.Вид = ВидСчета.Активный ИЛИ (Счет.Вид = ВидСчета.Активный И Сумма < 0) Тогда
Движение = Движения.Управленческий.Добавить();
Движение.Период = Дата;
Движение.Подразделение = ПодразделениеОтправитель;
Движение.СчетДт = ПланыСчетов.Управленческий.ОбособленныеПодразделения;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения] = ПодразделениеПолучатель;
Движение.СчетКт = Счет;
УстановитьСубконто(Движение.СубконтоКт);
Если Счет.Количественный Тогда
Движение.КоличествоКт = Количество;
КонецЕсли;
Движение.Сумма = Сумма;
Движение = Движения.Управленческий.Добавить();
Движение.Период = Дата;
Движение.Подразделение = ПодразделениеПолучатель;
Движение.СчетКт = ПланыСчетов.Управленческий.ОбособленныеПодразделения;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения] = ПодразделениеОтправитель;
Движение.СчетДт = Счет;
УстановитьСубконто(Движение.СубконтоДт);
Если Счет.Количественный Тогда
Движение.КоличествоДт = Количество;
КонецЕсли;
Движение.Сумма = Сумма;
Иначе
Движение = Движения.Управленческий.Добавить();
Движение.Период = Дата;
Движение.Подразделение = ПодразделениеОтправитель;
Движение.СчетКт = ПланыСчетов.Управленческий.ОбособленныеПодразделения;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения] = ПодразделениеПолучатель;
Движение.СчетДт = Счет;
УстановитьСубконто(Движение.СубконтоДт);
Если Счет.Количественный Тогда
Движение.КоличествоДт = Количество;
КонецЕсли;
Движение.Сумма = Сумма;
Движение = Движения.Управленческий.Добавить();
Движение.Период = Дата;
Движение.Подразделение = ПодразделениеПолучатель;
Движение.СчетДт = ПланыСчетов.Управленческий.ОбособленныеПодразделения;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения] = ПодразделениеОтправитель;
Движение.СчетКт = Счет;
УстановитьСубконто(Движение.СубконтоКт);
Если Счет.Количественный Тогда
Движение.КоличествоКт = Количество;
КонецЕсли;
Движение.Сумма = Сумма;
КонецЕсли;
КонецПроцедуры
4. Отчеты
Остатки БУ и УУ
ВЫБРАТЬ
УправленческийОстатки.Субконто1 КАК Товар,
УправленческийОстатки.КоличествоОстаток КАК КоличествоБУ,
0 КАК КоличествоУУ
ИЗ
РегистрБухгалтерии.Управленческий.Остатки(, , ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Номенклатура), ) КАК УправленческийОстатки
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ТоварыОстатки.Номенклатура,
0,
ТоварыОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.Товары.Остатки КАК ТоварыОстатки
Обратная связь:
1. Систематизация знаний
2. Проблем не было
3. Пока вопросов нет
Продолжаю догонять и не теряю надежды догнать. Задание, как ни странно, довольно простое.
1. Добавил в план счетов забалансовый счет 002 с двумя субконто Номенклатура и Контрагенты.
2. Добавил в документ “Поступление товаров” реквизит “Вид операции” (перечисление ВидыОперацийПоступления”). В зависимости от выбранного значения, документ либо формирует прежние движения, либо только движения в дебет счета 002. Обработка табличной части и подготовка таблицы к загрузке в регистр бухгалтерии осуществляется запросом. Движения формируются только по виду номенклатуры “Товар”.
3. Добавил в документ “Реализация товаров” реквизит “Вид операции” (перечисление ВидыОперацийРеализации). Для проведения по счету 002 модицифицировал имеющийся запрос получения остатков и для проведения по регистрам УУ поставил проверку на ВидОперации.
4. Создал справочник “Подразделения”, добавил реквизит “Подразделение” в измерения регистра бухгалтерии и в каждый документ, который делает проводки, доработал модули проведения. Для документа “Операция” запись подразделения осуществляется в модуле набора записи регистра бухгалтерии.
5. Создал документ “Авизо”. Для того, чтобы при перевыборе счета реквизиты “Субконто1” и “Субконто2” получали соответствущий субконто счета тип, в свойствах реквизитов установил связь по типу со значением “Элемент связи по типу” равным 1 для Субконто1 и 2 для Субконто2. Доступность реквизитов Субконто1, Субконто2 и Количество определяется при изменении счета и при открытии формы.
6. ОСВ и Баланс создаются довольно просто. Условия по Счету (В ИЕРАРХИИ) и Подразделение разместил на закладке “Компоновка данных” в кострукторе запросов.
7. Остатки по БУ и УУ выполнен запросом к справочнику Номенклатура с двумя левыми соединениями к регистру бухгалтерии и регистру накопления.
Резюме по блоку “Бухучет”. В отличие от упр-учета, с работой с регистрами бухгалтерии и проводками я сталкивался только поверхностно, поэтому практически вся информация была внове. Был очень рад еще одной порции знаний по СКД, детальному рассмотрению создания запроса “из кусочков” на примере сторно. Для данного блока, считаю информации предостаточно, ни убавить, ни прибавить.
1\ По операциям приема/возврата с хранения – сделано. По формированию проводок при приеме на хранение и возврате с хранения – сложностей не было. В общем модуле создан запрос к табл части соответствующего документа и если вид операции = поступление либо возврат с хранения то результаты запроса загружаются в движения соответствующего документа: ПоступлениеТМЦ либо Реализация. Текст функции общего модуля:
<code>Функция ЗапросТаблДляПроведенияТоваровНаХранении(Ссылка,ДтКт) Экспорт
ИмяТаблицы = “Документ.”+Ссылка.Метаданные().Имя+”.Товары”;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ДокТовары.Товар КАК СубконтоДтКт1,
| СУММА(ДокТовары.Количество * ДокТовары.Коэффициент) КАК КоличествоДтКт,
| СУММА(ДокТовары.Сумма) КАК Сумма,
| ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ТоварыНаХранении) КАК СчетДтКт,
| &Период,
| &Подразделение,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Номенклатура) КАК ВидСубконтоДтКт1,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты) КАК ВидСубконтоДтКт2,
| &Контрагент КАК СубконтоДтКт2
|ИЗ
| &ДокументТовары КАК ДокТовары
|ГДЕ
| ДокТовары.Ссылка = &Ссылка
| И ДокТовары.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
|
|СГРУППИРОВАТЬ ПО
| ДокТовары.Товар”;
Запрос.Текст = СтрЗаменить(Запрос.Текст,”&ДокументТовары”,ИмяТаблицы) ;
Запрос.Текст = СтрЗаменить(Запрос.Текст,”ДтКт”,ДтКт) ;
Запрос.УстановитьПараметр(“Контрагент”, Ссылка.Контрагент);
Запрос.УстановитьПараметр(“Период”, Ссылка.Дата);
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Подразделение”, Ссылка.Подразделение);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции</code>
По контролю остатков при возврате с хранения – делала несколько дольше, не сразу заработал механизм контроля остатков, так как неверно накладывала группировку
Для документа РеализацияТМЦ отдельным запросом выбираю суммы и номенклатуру по услугам из табл части и записываю их в движения регистра продажи и взаиморасчеты.
<code>Если Упр И ВидОперации = Перечисления.ВидыОпераций.ВозвратСХранения Тогда
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РеализацияТМЦТовары.Товар КАК Номенклатура,
| &Период,
| &Контрагент,
| &Подразделение,
| &Менеджер,
| &ВидДвижения,
| СУММА(РеализацияТМЦТовары.Сумма) КАК Сумма
|ИЗ
| Документ.РеализацияТМЦ.Товары КАК РеализацияТМЦТовары
|ГДЕ
| РеализацияТМЦТовары.Ссылка = &Ссылка
| И РеализацияТМЦТовары.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
|
|СГРУППИРОВАТЬ ПО
| РеализацияТМЦТовары.Товар”;
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Запрос.УстановитьПараметр(“Период”, Дата);
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Менеджер”, Менеджер);
Запрос.УстановитьПараметр(“ВидДвижения”, ВидДвиженияНакопления.Приход);
Запрос.УстановитьПараметр(“Подразделение”,Подразделение);
Результат = Запрос.Выполнить();
// регистр Продажи (только на строки с услугами)
Движения.Продажи.Загрузить(Результат.Выгрузить());
// регистр Взаиморасчеты (только на строки с услугами)
Движения.Взаиморасчеты.Загрузить(Результат.Выгрузить());
КонецЕсли; </code>
Запись проводок по продаже услуг по хранению (воспользовалась ранее созданной функцией общего модуля по получению суммы услуг документа), далее если сумма больше нуля добавляю проводку в регистр
2 Во все документы добавлен реквизит Подразделение, во все регистры накопления и регистр бухгалтерии добавлено измерение Подразделение. В документе Операция подразделение для проводок заполняется автоматически при записи проводки. Скорректированы запросы по проверке остатков с учетом нового измерения (в запросах добавлено доп.условие по подразделению в вирт таблицах регистров). Скорректированы запросы по получению табличных частей для загрузки в движения документов (добавлен параметр Подразделения) Сложностей не было, но времени ушло достаточно много, в том числе на тестирование, что ничего не испортила в процессе внесения правок. Поняла что такие доработки лучше продумывать изначально J
3. Документ Авизо – оказался наиболее сложной частью задания, не справилась с настройкой удобства работы с формой (автоматическое изменения видов субконто при изменении счета, недоступность полей субконто, если у счета их нет)
С ОбработкойПроведения сложностей не было (выполнено через обход табл части документа с проверкой условий по виду счета и сумме и добавлением описанных в задании проводок) через запрос не пробовала.
Правильно ли я понимаю, что запись движений в регистры через запрос на порядок эффективнее добавления проводок через метод Добавить? Сейчас при выполнении заданий мы делаем то через запрос, то через добавление – это правильный подход или в будущем мы узнаем правильные способы формирования записей регистров и тогда будем делать большинство записей в регистры через загрузку результатов запросов?
4. По отчетам особо сильных сложностей не было, но пересматривать теорию пришлось J
>Правильно ли я понимаю, что запись движений в регистры через запрос на порядок эффективнее добавления проводок через метод Добавить?
Нет, о порядке здесь говорить не приходится.
Однако незначительное ускорение от использования таблицы значений может быть, но оно действительно небольшое и будет проявляться только на больших объемах данных.
Задание выполнено.
http://www.imagepost.ru/?v=dz12_screen.png
Добавил забалансовый счет “002”, в документы прихода/расхода внес реквизит с перечислением перечисление “Покупка/Прием на хранение”. Проведение документов по этому счету (если перечисление = прием на храненеие, то срабатывает процедура):
Поступление товаров :
<code>
Процедура ВыполнитьДвиженияЗабалансовый(Движения) Экспорт
Отбор = Движения.Отбор;
Ссылка = Отбор.Регистратор.Значение;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ПоступлениеТоваровТовары.Номенклатура,
| ПоступлениеТоваровТовары.Ссылка.Контрагент,
| СУММА(ПоступлениеТоваровТовары.Количество * ПоступлениеТоваровТовары.К) КАК Количество,
| СУММА(ПоступлениеТоваровТовары.Сумма) КАК Сумма
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары
|ГДЕ
| ПоступлениеТоваровТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ПоступлениеТоваровТовары.Номенклатура,
| ПоступлениеТоваровТовары.Ссылка.Контрагент”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Проводка = Движения.Добавить();
Проводка.Период = Ссылка.Дата;
Проводка.СчетДТ = ПланыСчетов.Хозрасчетный.ТМЦПринятыеНаХранение;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Выборка.Контрагент;
Проводка.КоличествоДт = Выборка.Количество;
Проводка.Подразделение = Ссылка.Подразделение;
Проводка.Сумма = Выборка.Сумма;
КонецЦикла;
Движения.Записывать = Истина;
КонецПроцедуры
Процедура ВыполнитьДвиженияЗабалансовый(Движения) Экспорт Отбор = Движения.Отбор; Ссылка = Отбор.Регистратор.Значение; Запрос = Новый Запрос; Запрос.Текст = “ВЫБРАТЬ | ПоступлениеТоваровТовары.Номенклатура, | ПоступлениеТоваровТовары.Ссылка.Контрагент, | СУММА(ПоступлениеТоваровТовары.Количество * ПоступлениеТоваровТовары.К) КАК Количество, | СУММА(ПоступлениеТоваровТовары.Сумма) КАК Сумма |ИЗ | Документ.ПоступлениеТоваров.Товары КАК ПоступлениеТоваровТовары |ГДЕ | ПоступлениеТоваровТовары.Ссылка = &Ссылка | |СГРУППИРОВАТЬ ПО | ПоступлениеТоваровТовары.Номенклатура, | ПоступлениеТоваровТовары.Ссылка.Контрагент”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл Проводка = Движения.Добавить(); Проводка.Период = Ссылка.Дата; Проводка.СчетДТ = ПланыСчетов.Хозрасчетный.ТМЦПринятыеНаХранение; Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] = Выборка.Номенклатура; Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Выборка.Контрагент; Проводка.КоличествоДт = Выборка.Количество; Проводка.Подразделение = Ссылка.Подразделение; Проводка.Сумма = Выборка.Сумма; КонецЦикла; Движения.Записывать = Истина;КонецПроцедуры
</code>
Реализация товаров:
<code>Процедура ВыполнитьДвиженияЗабалансовыйРеализация(Движения, Отказ) Экспорт
Отбор = Движения.Отбор;
Ссылка = Отбор.Регистратор.Значение;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество) КАК Количество,
| СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК КоличествоОстаток,
| СУММА(ХозрасчетныйОстатки.СуммаОстаток) КАК СуммаОстаток,
| МАКСИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Остатки(, Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ТМЦПринятыеНаХранение), , Подразделение = &Подразделение) КАК ХозрасчетныйОстатки
| ПО РеализацияТоваровТовары.Номенклатура = ХозрасчетныйОстатки.Субконто1
| И РеализацияТоваровТовары.Ссылка.Контрагент = ХозрасчетныйОстатки.Субконто2
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Контрагент”, Ссылка.Контрагент);
Запрос.УстановитьПараметр(“Подразделение”, Ссылка.Подразделение);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Данного товара нет”;
Сообщение.Поле = “”;
Сообщение.УстановитьДанные(Ссылка.ПолучитьОбъект());
Сообщение.Сообщить();
Иначе
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Разница = Выборка.Количество – Выборка.КоличествоОстаток;
Если Разница>0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Нехватрка товара “+Выборка.Номенклатура+” в количестве: “+Разница;
Сообщение.Поле = “Товары[“+(Выборка.НомерСтроки-1)+”].Количество”;
Сообщение.УстановитьДанные(Ссылка.ПолучитьОбъект());
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
Проводка = Движения.Добавить();
Проводка.Период = Ссылка.Дата;
Проводка.СчетКТ = ПланыСчетов.Хозрасчетный.ТМЦПринятыеНаХранение;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура] =Выборка.Номенклатура;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Ссылка.Контрагент;
Проводка.КоличествоКт = Выборка.Количество;
Проводка.Подразделение = Ссылка.Подразделение;
Если Выборка.КоличествоОстаток <> 0 Тогда
Проводка.Сумма = Выборка.СуммаОстаток*Выборка.Количество/Выборка.КоличествоОстаток;
Иначе
Проводка.Сумма = 0;
КонецЕсли;
Если НЕ Отказ Тогда
Движения.Записывать = Истина;
Проводка = Движения.Добавить();
Проводка.Период = Ссылка.Дата;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Покупатели;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.Выручка;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагент] = Ссылка.Контрагент;
Проводка.Подразделение = Ссылка.Подразделение;
Проводка.Сумма = Ссылка.СуммаДокумента;
КонецЕсли;
КонецЦикла;
КонецЕсли;
КонецПроцедуры</code>
В регистр бухгалтерии было добавлено измерение (балансовое) “Подразделение” – ссылка на соответ. справочник, в коде формирования проводок также был добавлено это измерение.
Документ “Азиво”
Мобуль формы: <code>
&НаКлиенте
Процедура СчетОбработкаВыбора(Элемент, ВыбранноеЗначение, СтандартнаяОбработка)
ОчиститьЭлементы();
СтандартнаяОбработка = ИспользоватьВПроводках(ВыбранноеЗначение);
Если НЕ СтандартнаяОбработка Тогда
Предупреждение(“Нельзя использовать в проводках счета-группы: “+СокрЛП(ВыбранноеЗначение)+”.”);
Возврат;
КонецЕсли;
Структура = Новый Структура;
Структура = АнализСчета(ВыбранноеЗначение);
ОпределитьДоступность(Структура,ВыбранноеЗначение);
КонецПроцедуры
&НаСервереБезКонтекста
Функция АнализСчета(Счет)
СтруктураСчет = Новый Структура;
КолСубконто = Счет.ВидыСубконто.Количество();
СтруктураСчет.Вставить(“КолСубконто”, КолСубконто);
СтруктураСчет.Вставить(“Количественный”, Счет.Количественный);
Возврат СтруктураСчет;
КонецФункции // АнализСчета()
&НаКлиенте
Процедура ОчиститьЭлементы()
Элементы.Субконто1.Доступность = Ложь;
Элементы.Субконто2.Доступность = Ложь;
Элементы.Количество.Доступность = Ложь;
КонецПроцедуры // ОчиститьЭлементы()
&НаСервереБезКонтекста
Функция ИспользоватьВПроводках(Счет)
Если Счет.ЗапретитьИспользованиеВПроводках Тогда
Возврат Ложь;
КонецЕсли;
Возврат Истина;
КонецФункции
&НаКлиенте
Процедура ОпределитьДоступность(Структура, Счет)
Если Структура.КолСубконто = 2 Тогда
Элементы.Субконто1.Доступность = Истина;
Элементы.Субконто1.ОграничениеТипа = ТипСубконто(Структура.КолСубконто-2,Счет);
Элементы.Субконто1.ВыбиратьТип = Ложь;
Элементы.Субконто2.Доступность = Истина;
Элементы.Субконто2.ОграничениеТипа = ТипСубконто(Структура.КолСубконто-1,Счет);
Элементы.Субконто2.ВыбиратьТип = Ложь;
ИначеЕсли Структура.КолСубконто = 1 Тогда
Элементы.Субконто1.Доступность = Истина;
Элементы.Субконто1.ОграничениеТипа = ТипСубконто(Структура.КолСубконто-1,Счет);
Элементы.Субконто1.ВыбиратьТип = Ложь;
КонецЕсли;
Если Структура.Количественный Тогда
Элементы.Количество.Доступность = Истина;
КонецЕсли;
КонецПроцедуры // ОпределитьДоступность()
&НаСервереБезКонтекста
Функция ТипСубконто(Номер, Счет)
Тип = Новый ОписаниеТипов(Счет.ВидыСубконто.Получить(Номер).ВидСубконто.ТипЗначения.Типы());
возврат Тип;
КонецФункции // ТипСубконто()
&НаКлиенте
Процедура ПриОткрытии(Отказ)
Если ЗначениеЗаполнено(Объект.Счет) Тогда
КолСубконто = Объект.Счет.ВидыСубконто.Количество();
Пока КолСубконто > 0 Цикл
Элементы[“Субконто”+КолСубконто].Доступность = Истина;
КолСубконто = КолСубконто – 1;
КонецЦикла;
КонецЕсли;
Если Объект.Счет.Количественный Тогда
Элементы.Количество.Доступность = Истина;
КонецЕсли;
КонецПроцедуры
</code>
Модуль Объекта: <code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если (Счет.Вид = ВидСчета.Активный ИЛИ Счет.Вид = ВидСчета.АктивноПассивный) И Сумма > 0 Тогда
Проводка = Движения.Хозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.Подразделение = Отправитель;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Подразделение] = Получатель;
Проводка.СчетКт = Счет;
КоличествоСубконто = Счет.ВидыСубконто.Количество();
Пока КоличествоСубконто > 0 Цикл
Проводка.СубконтоКт[Счет.ВидыСубконто.Получить(КоличествоСубконто-1).ВидСубконто] = ЭтотОбъект[“Субконто”+КоличествоСубконто];
КоличествоСубконто = КоличествоСубконто – 1;
КонецЦикла;
Если Счет.Количественный = Истина Тогда
Проводка.КоличествоКт = Количество;
КонецЕсли;
Проводка.Сумма = Сумма;
Проводка = Движения.Хозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.Подразделение = Отправитель;
Проводка.СчетДт = Счет;
КоличествоСубконто = Счет.ВидыСубконто.Количество();
Пока КоличествоСубконто > 0 Цикл
Проводка.СубконтоДт[Счет.ВидыСубконто.Получить(КоличествоСубконто-1).ВидСубконто] = ЭтотОбъект[“Субконто”+КоличествоСубконто];
КоличествоСубконто = КоличествоСубконто – 1;
КонецЦикла;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Подразделение] = Отправитель;
Если Счет.Количественный = Истина Тогда
Проводка.КоличествоДт = Количество;
КонецЕсли;
Проводка.Сумма = Сумма;
Иначе
Проводка = Движения.Хозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.Подразделение = Отправитель;
Проводка.СчетДт = Счет;
КоличествоСубконто = Счет.ВидыСубконто.Количество();
Пока КоличествоСубконто > 0 Цикл
Проводка.СубконтоДт[Счет.ВидыСубконто.Получить(КоличествоСубконто-1).ВидСубконто] = ЭтотОбъект[“Субконто”+КоличествоСубконто];
КоличествоСубконто = КоличествоСубконто – 1;
КонецЦикла;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Подразделение] = Получатель;
Если Счет.Количественный = Истина Тогда
Проводка.КоличествоДт = Количество;
КонецЕсли;
Проводка.Сумма = Сумма;
Проводка = Движения.Хозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Подразделение] = Отправитель;
КоличествоСубконто = Счет.ВидыСубконто.Количество();
Пока КоличествоСубконто > 0 Цикл
Проводка.СубконтоКт[Счет.ВидыСубконто.Получить(КоличествоСубконто-1).ВидСубконто] = ЭтотОбъект[“Субконто”+КоличествоСубконто];
КоличествоСубконто = КоличествоСубконто – 1;
КонецЦикла;
Проводка.СчетКт = Счет;
Если Счет.Количественный = Истина Тогда
Проводка.КоличествоКт = Количество;
КонецЕсли;
Проводка.Сумма = Сумма;
КонецЕсли;
Движения.Хозрасчетный.Записывать = Истина;
КонецПроцедуры
</code>
По отчетам проблем не было, приведу пример запроса только по “Остатки БУ и УУ”, т.к. первые 2-а разбирались в теории.
<code>ВЫБРАТЬ
ЕСТЬNULL(ОстаткиТоваровОстатки.Номенклатура, ХозрасчетныйОстатки.Субконто1) КАК Товар,
СУММА(ЕСТЬNULL(ХозрасчетныйОстатки.КоличествоОстаток, 0)) КАК КоличествоБУ,
СУММА(ЕСТЬNULL(ОстаткиТоваровОстатки.КоличествоОстаток, 0)) КАК КоличествоУУ
ИЗ
РегистрНакопления.ОстаткиТоваров.Остатки КАК ОстаткиТоваровОстатки
ПОЛНОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Хозрасчетный.Остатки(, Счет.Количественный, ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Номенклатура), ) КАК ХозрасчетныйОстатки
ПО ОстаткиТоваровОстатки.Номенклатура = ХозрасчетныйОстатки.Субконто1
СГРУППИРОВАТЬ ПО
ХозрасчетныйОстатки.Субконто1,
ЕСТЬNULL(ОстаткиТоваровОстатки.Номенклатура, ХозрасчетныйОстатки.Субконто1)</code>
Добрый день. Отчитываюсь по заданию, извиняюсь за опоздание.
Задание выполнила. По ответственному хранению: изменила маску плана счетов и увеличила количество субконто до 2. Вид операций в документах ПТУ и РТУ реализован с помощью перечислений.
Контроль остатков при проведении реализации осуществляется с помощью запроса:
<code> Функция ПолучитьДанныеПоТМЦДляСписанияСХранения(Ссылка, Дата,Контрагент,Подразделение) Экспорт
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| ТЧТовары.Номенклатура,
| ТЧТовары.Количество КАК КолДок,
| ТЧТовары.Сумма КАК СуммаДок,
| ТЧТовары.НомерСтроки,
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.КоличествоОстатокДт, 0) КАК КолОст,
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстатокДт, 0) КАК СуммаОст
|ИЗ
| (ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
| МАКСИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки,
| СУММА(РеализацияТоваровТовары.Количество) КАК Количество,
| СУММА(РеализацияТоваровТовары.Сумма) КАК Сумма
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И (НЕ РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга))
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура) КАК ТЧТовары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(
| &МоментВремени,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ТМЦПринятые),
| ,
| (Субконто1, Субконто2) В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТовары.Номенклатура,
| &Контрагент
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И (НЕ РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)))
| И Подразделение = &Подразделение) КАК РегистрБухгалтерииХозрасчетныйОстатки
| ПО ТЧТовары.Номенклатура = РегистрБухгалтерииХозрасчетныйОстатки.Субконто1”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“МоментВремени”, Дата);
Запрос.УстановитьПараметр(“КОнтрагент”, Контрагент);
Запрос.УстановитьПараметр(“Подразделение”,Подразделение);
Возврат Запрос.Выполнить();
КонецФункции</code>
Я бы уточнила задание: ведь если мы реализуем услуги за ответ. хранение, то из регистров у нас не только продажи двигаются, но и взаиморасчеты тоже-в задании указаны только продажи.
Для подразделений – создала справочник “Подразделения”, во все документы добавила новый реквизит, в бух. регистр добавила измерение балансовое, подкорректировала движения и контроль остатков по бух. регистру.
В документе “Авизо” пришлось потрудиться над приведением типов:
<code>&НаКлиенте
Процедура СчетПриИзменении(Элемент)
СтруктураДанных = ЗаполнитьТипыСубконтоНаСервере(Объект.Счет);
Инд = 0;
Пока Инд < СтруктураДанных.Количество() Цикл
Инд = Инд+1;
Эл = Элементы[“Субконто”+Инд];
Эл.ОграничениеТипа = СтруктураДанных[“Субконто”+Инд];
Эл.ВыбиратьТип = Ложь;
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ЗаполнитьТипыСубконтоНаСервере(Счет)
СтруктураТипов = Новый Структура;
ВидыСубконто = Счет.ВидыСубконто;
Для каждого Вид Из ВидыСубконто Цикл
ОпТипа = Новый ОписаниеТипов(Вид.ВидСубконто.ТипЗначения.Типы());
СтруктураТипов.Вставить(“Субконто”+Вид.НомерСтроки,ОпТипа);
КонецЦикла;
Возврат СтруктураТипов;
КонецФункции // ЗаполнитьТипыСубконтоНаСервере()
</code>
модуль проведения документа:
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.Активность = Истина;
Проводка.Подразделение = ПодразделениеОтправитель;
Проводка.Сумма = Сумма;
Если Счет.Вид = ВидСчета.Активный или (Счет.Вид = ВидСчета.АктивноПассивный и Сумма>0) Тогда
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ОбособленныеПодразделения] = ПодразделениеПолучатель;
Проводка.СчетКт = Счет;
Для каждого Вид Из Счет.ВидыСубконто Цикл
Проводка.СубконтоКт[Вид.ВидСубконто] = Вычислить(“Субконто”+ Вид.НомерСтроки);
КонецЦикла;
Если Счет.Количественный Тогда
Проводка.КоличествоКт = Количество;
КонецЕсли;
Иначе
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ОбособленныеПодразделения] = ПодразделениеПолучатель;
Проводка.СчетДт = Счет;
Для каждого Вид Из Счет.ВидыСубконто Цикл
Проводка.СубконтоДт[Вид.ВидСубконто] = Вычислить(“Субконто”+ Вид.НомерСтроки);
КонецЦикла;
Если Счет.Количественный Тогда
Проводка.КоличествоДт = Количество;
КонецЕсли;
КонецЕсли;
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.Активность = Истина;
Проводка.Подразделение = ПодразделениеПолучатель;
Проводка.Сумма = Сумма;
Если Счет.Вид = ВидСчета.Активный или (Счет.Вид = ВидСчета.АктивноПассивный и Сумма>0) Тогда
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.ОбособленныеПодразделения] = ПодразделениеОтправитель;
Проводка.СчетДт = Счет;
Для каждого Вид Из Счет.ВидыСубконто Цикл
Проводка.СубконтоДт[Вид.ВидСубконто] = Вычислить(“Субконто”+ Вид.НомерСтроки);
КонецЦикла;
Если Счет.Количественный Тогда
Проводка.КоличествоДт = Количество;
КонецЕсли;
Иначе
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.ОбособленныеПодразделения] = ПодразделениеОтправитель;
Проводка.СчетКт = Счет;
Для каждого Вид Из Счет.ВидыСубконто Цикл
Проводка.СубконтоКт[Вид.ВидСубконто] = Вычислить(“Субконто”+ Вид.НомерСтроки);
КонецЦикла;
Если Счет.Количественный Тогда
Проводка.КоличествоКт = Количество;
КонецЕсли;
КонецЕсли;
Движения.РегистрБухгалтерииХозрасчетный.Записывать = Истина;
КонецПроцедуры
</code>
С отчетами вопросов не возникло. Были затруднения с отображением субконто в одной строке, но разобралась.
Обратная связь:
1. Вся информация по СКД. Ранее обходила этот механизм, так как отчеты как правило нетиповые совсем, а времени разбираться как это работает нет как обычно, проще по старому.
В запросах по бух. регистрах редко использовала таблицу “Движения с субконто”, чаще Остатки и обороты и Обороты с детализацией по регистратору – никогда и в голову не приходило, что это может быть не оптимально.
2. Особых затруднений нет – если вопросы возникают, то получаю на них ответы в решении ДЗ.
3. Как и многих – волнует СКД, особенно использование расшифровок, нестандартных макетов и работа в модуле с данным инструментом.
Задание выполнил. Сложностей не возникло.
Ответственное хранение
Создал забалансовый счет 002 “ТМЦПринятыеНаХранение”, Субконто1 – Товар, Субконто2-Контрагент. Установил признак количественного учета.
Создал два перечисления “ВидыОперацийПоступленияТоваровУслуг” (эоементы – Покупка, ПриемНаХранение) и “ВидыОперацийРеализацииТоваровУслуг” (элементы – Продажа, ВозвратТоваровНаОтветХранении)
Добавил в документы ПотуплениеТУ и РеализацияТУ обязательный к заполнению реквизит “ВидОперации” соответствующего типа. Модифицировал проведение обоих документов.
В качестве подразделения добавил реквизит “Организация”
//Модуль документа “Поступление ТУ”
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если УУ Тогда
ВыполнитьДвиженияПоРегистрамУправленческогоУчета(Отказ);
КонецЕсли;
Если БУ Тогда
ВыполнитьДвиженияПоРегистрамБухгалтерскогоУчета(Отказ);
КонецЕсли;
КонецПроцедуры
Если УУ Тогда ВыполнитьДвиженияПоРегистрамУправленческогоУчета(Отказ); КонецЕсли; Если БУ Тогда ВыполнитьДвиженияПоРегистрамБухгалтерскогоУчета(Отказ); КонецЕсли; КонецПроцедуры
Процедура ВыполнитьДвиженияПоРегистрамУправленческогоУчета(Отказ)
Движения.ТоварыНаСкладах.Записывать = Истина;
Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина;
Если ВидОперации = Перечисления.ВидыОперацийПоступленияТоваровУслуг.ПриемНаХранение Тогда
Возврат;
КонецЕсли;
//По регистру ТоварыНаСкладах
ТаблицаТоваровОприходованныхНаСклад = ПолучитьТаблицуТоваровОприхцФодованныхНаСклад();
Движения.ТоварыНаСкладах.Загрузить(ТаблицаТоваровОприходованныхНаСклад);
Движения.Закупки.Записывать = Истина;
Для Каждого ТекСтрока Из Товары Цикл
//По регистру Закупки
НовоеДвижение = Движения.Закупки.Добавить();
НовоеДвижение.Активность = Истина;
НовоеДвижение.Период = Дата;
НовоеДвижение.Организация = Организация;
НовоеДвижение.Контрагент = Контрагент;
НовоеДвижение.Номенклатура = ТекСтрока.Номенклатура;
НовоеДвижение.Количество = ТекСтрока.Количество*ТекСтрока.Коэффициент;
НовоеДвижение.Стоимость = ТекСтрока.Сумма;
КонецЦикла;
//По регистру Взаиморасчеты с контрагентами
НоваяЗапись = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьРасход();
НоваяЗапись.Период = Дата;
НоваяЗапись.Организация = Организация;
НоваяЗапись.Контрагент = Контрагент;
НоваяЗапись.Сумма = Товары.Итог(“Сумма”);
КонецПроцедуры
Процедура ВыполнитьДвиженияПоРегистрамБухгалтерскогоУчета(Отказ)
Движения.Управленческий.Записывать = Истина;
Для Каждого Текстрока Из Товары Цикл
//по регистру бухгалтерии Управленческий
НовоеДвижение = Движения.Управленческий.Добавить();
НовоеДвижение.Период = Дата;
НовоеДвижение.Организация = Организация;
//ДЗ 12
Если ВидОперации = Перечисления.ВидыОперацийПоступленияТоваровУслуг.Покупка Тогда
Если ТекСтрока.Номенклатура.ВидНоменклатуры = Перечисления.ВидыНоменклатуры.Услуга Тогда
НовоеДвижение.СчетДт = ПланыСчетов.Основной.Затраты;
Иначе
НовоеДвижение.СчетДт = ПланыСчетов.Основной.Товары;
НовоеДвижение.СубконтоДт.Товар = ТекСтрока.Номенклатура;
КонецЕсли;
НовоеДвижение.СчетКт = ПланыСчетов.Основной.Поставщики;
НовоеДвижение.СубконтоКт.Контрагент = Контрагент;
Иначе
НовоеДвижение.СчетДт = ПланыСчетов.Основной.ТМЦПринятыеНаХранение;
НовоеДвижение.СубконтоДт.Товар = ТекСтрока.Номенклатура;
НовоеДвижение.СубконтоДт.Контрагент = Контрагент;
КонецЕсли;
Если ТекСтрока.Номенклатура.ВидНоменклатуры <> Перечисления.ВидыНоменклатуры.Услуга Тогда
НовоеДвижение.КоличествоДт = Текстрока.Количество*Текстрока.Коэффициент;
КонецЕсли;
НовоеДвижение.Сумма = ТекСтрока.Сумма;
КонецЦикла;
КонецПроцедуры
</code>
//Модуль документа “Реализация ТУ”
<code>
Процедура ВыполнитьДвиженияПоРегистрамУправленческогоУчета(Отказ)
Если ВидОперации = Перечисления.ВидыОперацийРеализацииТоваровУслуг.Продажа Тогда
//По регистру ТоварыНаСкладах
ТаблицаТоваровОприходованныхНаСклад = ПолучитьТаблицуТоваровОприхцФодованныхНаСклад();;
Движения.ТоварыНаСкладах.Загрузить(ТаблицаТоваровОприходованныхНаСклад);
Движения.ТоварыНаСкладах.Записать();
ПроверитьОстаткиПоРегиструТоварыНаСкладах(ТаблицаТоваровОприходованныхНаСклад, Отказ);
Если Отказ Тогда
Возврат;
КонецЕсли;
//По регистру Взаиморасчеты с контрагентами
Движения.ВзаиморасчетыСКонтрагентами.Записывать = Истина;
НоваяЗапись = Движения.ВзаиморасчетыСКонтрагентами.ДобавитьПриход();
НоваяЗапись.Период = Дата;
НоваяЗапись.Организация = Организация;
НоваяЗапись.Контрагент = Контрагент;
НоваяЗапись.Сумма = Товары.Итог(“Сумма”);
КонецЕсли;
//По регистру Продажи
ТаблицаПродаж = Товары.ВыгрузитьКолонки();
ТаблицаПродаж.Колонки.Добавить(“Период”);
ТаблицаПродаж.Колонки.Добавить(“Контрагент”);
ТаблицаПродаж.Колонки.Добавить(“Менеджер”);
ТаблицаПродаж.Колонки.Добавить(“Организация”);
Для Каждого ТекСтрока Из Товары Цикл
НоваяСтрока = ТаблицаПродаж.Добавить();
ЗаполнитьЗначенияСвойств(НоваяСтрока, ТекСтрока);
НоваяСтрока.Количество = ТекСтрока.Количество*ТекСтрока.Коэффициент;
НоваяСтрока.Период = Дата;
НоваяСтрока.Организация = Организация;
НоваяСтрока.Контрагент = Контрагент;
НоваяСтрока.Менеджер = Ответствтвенный;
КонецЦикла;
НаборДвижений = Движения.Продажи;
НаборДвижений.Записывать = Истина;
НаборДвижений.Загрузить(ТаблицаПродаж);
КонецПроцедуры
Процедура ВыполнитьДвиженияПоРегистрамБухгалтерскогоУчета(Отказ)
//По регистру Управленческий
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| МИНИМУМ(РеализацияТоваровУслугТовары.НомерСтроки) КАК НомерСтроки,
| РеализацияТоваровУслугТовары.Номенклатура,
| СУММА(РеализацияТоваровУслугТовары.Количество*РеализацияТоваровУслугТовары.Коэффициент) КАК Количество,
| СУММА(РеализацияТоваровУслугТовары.Сумма) КАК Сумма
| ПОМеСТИТЬ Товары
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка = &Ссылка
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровУслугТовары.Номенклатура
|;
|//////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Товары.НомерСтроки,
| Товары.Номенклатура,
| Товары.Количество КАК КоличествоДок,
| Товары.Сумма КАК СуммаДок,
| ЕСТЬNULL(УправленческийОстатки.КоличествоОстаток,0) КАК КоличествоОстаток,
| ЕСТЬNULL(УправленческийОстатки.СуммаОстаток,0) КАК СуммаОстаток
|ИЗ
| Товары КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки(&Период, Счет = ЗНАЧЕНИЕ(ПланСчетов.Основной.”
+ ?(ВидОперации = Перечисления.ВидыОперацийРеализацииТоваровУслуг.ВозвратТоваровНаОтветХранении,”ТМЦПринятыеНаХранение”, “Товары”) + “)
| ,, Субконто1 В (ВЫБРАТЬ Товары.Номенклатура ИЗ Товары КАК Товары)”
+ ?(ВидОперации = Перечисления.ВидыОперацийРеализацииТоваровУслуг.ВозвратТоваровНаОтветХранении,” И Субконто2 = &Контрагент”, “”) + ”
| И Организация = &Организация) КАК УправленческийОстатки
| ПО Товары.Номенклатура = УправленческийОстатки.Субконто1
|”;
Запрос.УстановитьПараметр(“Период”, Новый Граница(МоментВремени(), ВидГраницы.Включая));
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Запрос.УстановитьПараметр(“Организация”, Организация);
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
Нехватка = Выборка.КоличествоДок – Выборка.КоличествоОстаток;
Если Нехватка > 0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Товара ” + Строка(Выборка.Номенклатура) + ” не достаточно в количестве ” + Нехватка;
Сообщение.Поле = “Товары[” + (Выборка.НомерСтроки – 1) + “].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
НоваяЗапись = Движения.Управленческий.Добавить();
НоваяЗапись.Период = Дата;
НоваяЗапись.Организация = Организация;
Если ВидОперации = Перечисления.ВидыОперацийРеализацииТоваровУслуг.Продажа Тогда
НоваяЗапись.СчетДт = ПланыСчетов.Основной.Себестоимость;
НоваяЗапись.СчетКт = ПланыСчетов.Основной.Товары;
НоваяЗапись.СубконтоКт.Товар = Выборка.Номенклатура;
Иначе
НоваяЗапись.СчетКт = ПланыСчетов.Основной.ТМЦПринятыеНаХранение;
НоваяЗапись.СубконтоКт.Товар = Выборка.Номенклатура;
НоваяЗапись.СубконтоКт.Контрагент = Контрагент;
КонецЕсли;
НоваяЗапись.КоличествоКт = Выборка.КоличествоДок;
НоваяЗапись.Сумма = ?(Выборка.КоличествоОстаток = 0, 0, (Выборка.СуммаОстаток*Выборка.КоличествоДок)/Выборка.КоличествоОстаток);
КонецЦикла;
Движения.Управленческий.Записывать = НЕ Отказ;
Если НЕ Отказ Тогда
НоваяЗапись = Движения.Управленческий.Добавить();
НоваяЗапись.Период = Дата;
НоваяЗапись.Организация = Организация;
НоваяЗапись.СчетДт = ПланыСчетов.Основной.Покупатели;
НоваяЗапись.СубконтоДт.Контрагент = Контрагент;
НоваяЗапись.СчетКт = ПланыСчетов.Основной.Выручка;
НоваяЗапись.Сумма = Товары.Итог(“Сумма”);
КонецЕсли;
КонецПроцедуры
Процедура ПроверитьОстаткиПоРегиструТоварыНаСкладах(ТаблицаТоваровОприходованныхНаСклад, Отказ)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ТаблицаТоваровОприходованныхНаСклад.НомерСтроки,
| ТаблицаТоваровОприходованныхНаСклад.Номенклатура,
| ТаблицаТоваровОприходованныхНаСклад.Качество
| ПОМЕСТИТЬ Товары
|ИЗ
| &ТаблицаТоваровОприходованныхНаСклад КАК ТаблицаТоваровОприходованныхНаСклад;
|///////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| МИНИМУМ(Товары.НомерСтроки) КАК НомерСтроки,
| Товары.Номенклатура,
| Товары.Качество
| ПОМЕСТИТЬ ТоварыПоНоменклатуреКачеству
|ИЗ
| Товары КАК Товары
|СГРУППИРОВАТЬ ПО
| Товары.Номенклатура,
| Товары.Качество;
|///////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| Товары.НомерСтроки,
| Товары.Номенклатура.Наименование КАК Номенклатура,
| Товары.Качество,
| ОстаткиНаСкладах.КоличествоОстаток КАК Количество
|ИЗ
| ТоварыПоНоменклатуреКачеству КАК Товары
| ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварыНаСкладах.Остатки(&МоментВремени,
| Склад = &Склад
| И (Номенклатура, Качество) В (ВЫБРАТЬ Товары.Номенклатура, Товары.Качество ИЗ Товары)
| И Организация = &Организация) КАК ОстаткиНаСкладах
| ПО Товары.Номенклатура = ОстаткиНаСкладах.Номенклатура
| И Товары.Качество = ОстаткиНаСкладах.Качество
|ГДЕ
| ОстаткиНаСкладах.КоличествоОстаток < 0
|”;
Запрос.УстановитьПараметр(“ТаблицаТоваровОприходованныхНаСклад”, ТаблицаТоваровОприходованныхНаСклад);
Запрос.УстановитьПараметр(“Склад”, Склад);
ГраницаМомента = Новый Граница(МоментВремени(), ВидГраницы.Включая);
Запрос.УстановитьПараметр(“МоментВремени”, ГраницаМомента);
Запрос.УстановитьПараметр(“Организация”, Организация);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
НеКонтролироватьОстаткиДляПОльзователя = ОбщиеФункцииСервер.ПолучитьНастройкуПользователя(“НеПроверятьОстаткиПриотгрузке”);
Если НЕ Результат.Пустой() И НЕ (мНеКонтролироватьОстатки ИЛИ НеКонтролироватьОстаткиДляПОльзователя) Тогда
Отказ = Истина;
КонецЕсли;
Пока Выборка.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Не хватает товара ” + Выборка.Номенклатура + ” в количестве ” + (-Выборка.Количество);
Если Отказ И Выборка.НомерСтроки>0 Тогда
Сообщение.Поле = “Товары[” + (Выборка.НомерСтроки-1) + “].Количество”;
КонецЕсли;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЦикла;
КонецПроцедуры
Функция ПолучитьТаблицуТоваровОприхцФодованныхНаСклад()
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ЗНАЧЕНИЕ(ВидДвиженияНакопления.Расход) КАК ВидДвижения,
| ИСТИНА КАК Активность,
| РеализацияТоваровУслугТовары.Ссылка.Организация КАК Организация,
| РеализацияТоваровУслугТовары.Ссылка.Дата КАК Период,
| РеализацияТоваровУслугТовары.Ссылка.Склад КАК Склад,
| ВЫБОР
| КОГДА РеализацияТоваровУслугТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Набор)
| ТОГДА ЕСТЬNULL(РеализацияТоваровУслугСоставНабора.Комплектующая, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка))
| ИНАЧЕ РеализацияТоваровУслугТовары.Номенклатура
| КОНЕЦ КАК Номенклатура,
| ВЫБОР
| КОГДА РеализацияТоваровУслугТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Набор)
| ТОГДА РеализацияТоваровУслугТовары.Количество*РеализацияТоваровУслугТовары.Коэффициент*ЕСТЬNULL(РеализацияТоваровУслугСоставНабора.Количество,0)
| ИНАЧЕ РеализацияТоваровУслугТовары.Количество*РеализацияТоваровУслугТовары.Коэффициент
| КОНЕЦ КАК Количество,
| ВЫБОР
| КОГДА РеализацияТоваровУслугТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Набор)
| ТОГДА ЗНАЧЕНИЕ(Справочник.Качество.Новый)
| ИНАЧЕ РеализацияТоваровУслугТовары.Качество
| КОНЕЦ КАК Качество,
| ВЫБОР
| КОГДА РеализацияТоваровУслугТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Набор)
| ТОГДА 0
| ИНАЧЕ РеализацияТоваровУслугТовары.НомерСтроки
| КОНЕЦ КАК НомерСтроки
|ИЗ
| Документ.РеализацияТоваровУслуг.Товары КАК РеализацияТоваровУслугТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваровУслуг.СоставНабора КАК РеализацияТоваровУслугСоставНабора
| ПО РеализацияТоваровУслугТовары.Номенклатура = РеализацияТоваровУслугСоставНабора.Номенклатура
|ГДЕ
| РеализацияТоваровУслугТовары.Ссылка = &Ссылка
| И РеализацияТоваровУслугТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
| И (ВЫБОР
| КОГДА РеализацияТоваровУслугТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Набор)
| ТОГДА ЕСТЬNULL(РеализацияТоваровУслугСоставНабора.Комплектующая, ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка))
| ИНАЧЕ РеализацияТоваровУслугТовары.Номенклатура
| КОНЕЦ) <> ЗНАЧЕНИЕ(Справочник.Номенклатура.ПустаяСсылка)
| И (ВЫБОР
| КОГДА РеализацияТоваровУслугТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Набор)
| ТОГДА РеализацияТоваровУслугТовары.Количество*РеализацияТоваровУслугТовары.Коэффициент*ЕСТЬNULL(РеализацияТоваровУслугСоставНабора.Количество,0)
| ИНАЧЕ РеализацияТоваровУслугТовары.Количество*РеализацияТоваровУслугТовары.Коэффициент
| КОНЕЦ) > 0
|”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Возврат Запрос.Выполнить().Выгрузить();
КонецФункции
</code>
2. Документ “Авизо”
Создал документ.
Реквизиты:
ОрганизацияОтправитель
ОрганизацияПолучатель
Табличная часть “АктивыПассивы”
Реквизиты:
ВидСубконто1
ВидСубконто2
Количественный
Количество
Субконто1
Субконто2
Сумма
Счет
//Модуль формы
<code>
&НаКлиенте
Процедура АктивыПассивыСчетПриИзменении(Элемент)
ТекСтрока = Элементы.АктивыПассивы.ТекущиеДанные;
Если ТекСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
СтруктураСтроки = ОбщиеФункцииКлиент.ПреобразоватьСтрокуВСтруктуру(ТекСтрока, Элементы.АктивыПассивы.ПодчиненныеЭлементы);
ПриИзмененииСчетаСервер(СтруктураСтроки);
ЗаполнитьЗначенияСвойств(ТекСтрока, СтруктураСтроки);
КонецПроцедуры
&НаСервере
Процедура ПриИзмененииСчетаСервер(СтруктураСтроки)
ТаблицаВидовСубконто = СтруктураСтроки.Счет.ВидыСубконто;
ВидСубконто1 = ?(ТаблицаВидовСубконто.Количество()>0, ТаблицаВидовСубконто[0].ВидСубконто, Неопределено);
ВидСубконто2 = ?(ТаблицаВидовСубконто.Количество()>1, ТаблицаВидовСубконто[1].ВидСубконто, Неопределено);
СтруктураСтроки.ВидСубконто1 = ВидСубконто1;
СтруктураСтроки.ВидСубконто2 = ВидСубконто2;
Если ВидСубконто1 = Неопределено Тогда
СтруктураСтроки.Субконто1 = Неопределено;
Иначе
СтруктураСтроки.Субконто1 = ВидСубконто1.ТипЗначения.ПривестиЗначение(СтруктураСтроки.Субконто1);
КонецЕсли;
Если ВидСубконто2 = Неопределено Тогда
СтруктураСтроки.Субконто2 = Неопределено;
Иначе
СтруктураСтроки.Субконто2 = ВидСубконто2.ТипЗначения.ПривестиЗначение(СтруктураСтроки.Субконто2);
КонецЕсли;
СтруктураСтроки.Количественный = СтруктураСтроки.Счет.Количественный;
СтруктураСтроки.Количество = ?(СтруктураСтроки.Счет.Количественный, СтруктураСтроки.Количество, 0);
КонецПроцедуры
&НаКлиенте
Процедура КоличествоПриИзменении(Элемент)
ТекСтрока = Элементы.АктивыПассивы.ТекущиеДанные;
Если ТекСтрока = Неопределено Тогда
Возврат;
КонецЕсли;
Если ЗначениеЗаполнено(ТекСтрока.Счет) И ЗначениеЗаполнено(ТекСтрока.Количество) И НЕ ТекСтрока.Количественный Тогда
Сообщить(“Ошибка! Для данного счета не установлен количественный признак учета.”);
ТекСтрока.Количество = 0;
КонецЕсли;
КонецПроцедуры
</code>
//Модуль Объекта
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
//ДЗ 12
Движения.Управленческий.Записывать = Истина;
//по регистру Управленческий
Для Каждого ТекСтрока Из АктивыПассивы Цикл
НовоеДвижениеПоОтправителю = Движения.Управленческий.Добавить();
НовоеДвижениеПоОтправителю.Период = Дата;
НовоеДвижениеПоОтправителю.Организация = ОрганизацияОтправитель;
НовоеДвижениеПоПолучателю = Движения.Управленческий.Добавить();
НовоеДвижениеПоПолучателю.Период = Дата;
НовоеДвижениеПоПолучателю.Организация = ОрганизацияПолучатель;
Если ТекСтрока.Счет.Вид = ВидСчета.Активный
ИЛИ (ТекСтрока.Счет.Вид = ВидСчета.АктивноПассивный И ТекСтрока.Сумма > 0) Тогда
НовоеДвижениеПоОтправителю.СчетДт = ПланыСчетов.Основной.ВнутрихозяйственныеРасчеты;
НовоеДвижениеПоОтправителю.СубконтоДт.Организация = ОрганизацияПолучатель;
НовоеДвижениеПоОтправителю.СчетКт = ТекСтрока.Счет;
Если ЗначениеЗаполнено(ТекСтрока.ВидСубконто1) Тогда
НовоеДвижениеПоОтправителю.СубконтоКт[ТекСтрока.ВидСубконто1] = ТекСтрока.Субконто1;
КонецЕсли;
Если ЗначениеЗаполнено(ТекСтрока.ВидСубконто2) Тогда
НовоеДвижениеПоОтправителю.СубконтоКт[ТекСтрока.ВидСубконто2] = ТекСтрока.Субконто2;
КонецЕсли;
НовоеДвижениеПоПолучателю.СчетДт = ТекСтрока.Счет;
Если ЗначениеЗаполнено(ТекСтрока.ВидСубконто1) Тогда
НовоеДвижениеПоПолучателю.СубконтоДт[ТекСтрока.ВидСубконто1] = ТекСтрока.Субконто1;
КонецЕсли;
Если ЗначениеЗаполнено(ТекСтрока.ВидСубконто2) Тогда
НовоеДвижениеПоПолучателю.СубконтоДт[ТекСтрока.ВидСубконто2] = ТекСтрока.Субконто2;
КонецЕсли;
НовоеДвижениеПоПолучателю.СчетКт = ПланыСчетов.Основной.ВнутрихозяйственныеРасчеты;
НовоеДвижениеПоПолучателю.СубконтоКт.Организация = ОрганизацияОтправитель;
Если ТекСтрока.Счет.Количественный Тогда
НовоеДвижениеПоОтправителю.КоличествоКт = Текстрока.Количество;
НовоеДвижениеПоПолучателю.КоличествоДт = Текстрока.Количество;
КонецЕсли;
Иначе
НовоеДвижениеПоОтправителю.СчетДт = ТекСтрока.Счет;
Если ЗначениеЗаполнено(ТекСтрока.ВидСубконто1) Тогда
НовоеДвижениеПоОтправителю.СубконтоДт[ТекСтрока.ВидСубконто1] = ТекСтрока.Субконто1;
КонецЕсли;
Если ЗначениеЗаполнено(ТекСтрока.ВидСубконто2) Тогда
НовоеДвижениеПоОтправителю.СубконтоДт[ТекСтрока.ВидСубконто2] = ТекСтрока.Субконто2;
КонецЕсли;
НовоеДвижениеПоОтправителю.СчетКт = ПланыСчетов.Основной.ВнутрихозяйственныеРасчеты;
НовоеДвижениеПоОтправителю.СубконтоКт.Организация = ОрганизацияПолучатель;
НовоеДвижениеПоПолучателю.СчетДт = ПланыСчетов.Основной.ВнутрихозяйственныеРасчеты;
НовоеДвижениеПоПолучателю.СубконтоДт.Организация = ОрганизацияОтправитель;
НовоеДвижениеПоПолучателю.СчетКт = ТекСтрока.Счет;
Если ЗначениеЗаполнено(ТекСтрока.ВидСубконто1) Тогда
НовоеДвижениеПоПолучателю.СубконтоКт[ТекСтрока.ВидСубконто1] = ТекСтрока.Субконто1;
КонецЕсли;
Если ЗначениеЗаполнено(ТекСтрока.ВидСубконто2) Тогда
НовоеДвижениеПоПолучателю.СубконтоКт[ТекСтрока.ВидСубконто2] = ТекСтрока.Субконто2;
КонецЕсли;
Если ТекСтрока.Счет.Количественный Тогда
НовоеДвижениеПоОтправителю.КоличествоДт = Текстрока.Количество;
НовоеДвижениеПоПолучателю.КоличествоКт = Текстрока.Количество;
КонецЕсли;
КонецЕсли;
НовоеДвижениеПоОтправителю.Сумма = ТекСтрока.Сумма;
НовоеДвижениеПоПолучателю.Сумма = ТекСтрока.Сумма;
КонецЦикла;
КонецПроцедуры
</code>
3. Создал все отчеты
//Запрос для отчета “Оборотно-сальдовая ведомость по счету”
<code>
ВЫБРАТЬ
УправленческийОстаткиИОбороты.Счет,
УправленческийОстаткиИОбороты.Субконто1,
УправленческийОстаткиИОбороты.Субконто2,
УправленческийОстаткиИОбороты.СуммаНачальныйОстатокДт,
УправленческийОстаткиИОбороты.СуммаНачальныйОстатокКт,
УправленческийОстаткиИОбороты.СуммаОборотДт,
УправленческийОстаткиИОбороты.СуммаОборотКт,
УправленческийОстаткиИОбороты.СуммаКонечныйОстатокДт,
УправленческийОстаткиИОбороты.СуммаКонечныйОстатокКт,
УправленческийОстаткиИОбороты.Организация
ИЗ
РегистрБухгалтерии.Управленческий.ОстаткиИОбороты КАК УправленческийОстаткиИОбороты
</code>
//Запрос для отчета “Баланс”
<code>
ВЫБРАТЬ
УправленческийОстатки.Счет,
ВЫБОР
КОГДА УправленческийОстатки.СуммаОстатокДт > 0
ТОГДА УправленческийОстатки.СуммаОстатокДт
ИНАЧЕ УправленческийОстатки.СуммаОстатокКт
КОНЕЦ КАК Сумма,
ВЫБОР
КОГДА УправленческийОстатки.СуммаОстатокДт > 0
ТОГДА “Актив”
ИНАЧЕ “Пассив”
КОНЕЦ КАК ВидСредств,
УправленческийОстатки.Организация
ИЗ
РегистрБухгалтерии.Управленческий.Остатки КАК УправленческийОстатки
ГДЕ
НЕ УправленческийОстатки.Счет.Забалансовый
</code>
//Запрос для отчета “Остатки БУ и УУ”
<code>
ВЫБРАТЬ
ВыборкаОстатков.Номенклатура,
СУММА(ВыборкаОстатков.КоличествоУУ) КАК КоличествоУУ,
СУММА(ВыборкаОстатков.КоличествоБУ) КАК КоличествоБУ
ИЗ
(ВЫБРАТЬ
ТоварыНаСкладахОстатки.Номенклатура,
ТоварыНаСкладахОстатки.КоличествоОстаток КАК КоличествоУУ,
0 КАК КоличествоБУ
ИЗ
РегистрНакопления.ТоварыНаСкладах.Остатки КАК ТоварыНаСкладахОстатки
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
УправленческийОстатки.Субконто1,
0 КАК КоличествоУУ,
УправленческийОстатки.КоличествоОстаток КАК КоличествоБУ
ИЗ
РегистрБухгалтерии.Управленческий.Остатки(, , ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товар), ) КАК УправленческийОстатки) КАК ВыборкаОстатков
СГРУППИРОВАТЬ ПО
ВыборкаОстатков.Номенклатура
</code>
Задание выполнено.
1. Организован учет ответственного хранения, добавлен забалансовый счет 002, доработано проведение документов поступления и реализации, в том числе контроль, добавлены реквизиты “Операция” с типом перечисление.
2. Реализовал учет по обособленным подразделениям, добавил реквизиты в документы и измерение в регистр бухгалтерии, обеспечил заполнение измерения при проведении документов.
3. Создал документ “Авизо” и обеспечил его проведение в соответствии с требованиями задания. Обеспечил связь возможности заполнения полей субконто в зависимости от их наличия у выбранного счета.
4. Разработал отчеты согласно заданию при помощи СКД аналогично подобным отчетам, рассмотренным в материалах курса. Отчет “Остатки УУ и БУ” построил с использованием в запросе соединения виртуальных таблиц остатков регистра бухгалтерии с отбором по субконто “Номенклатура” и регистра накопления “ОстаткиТоваров”.
Обратная связь.
1. Правильная методология реализации казалось бы простых вещей.
2. Механизм универсального сторнирования регистров сведений =) Конструировать запросы без помощи конструктора непросто, хотя сама идея в общем понятна.
3. Все раскрыто достаточно подробно.
Задание выполнил
В документах Поступление и Реализации введен реквизит ВидОперации типа Перечисления.ВидыОпераций.
План счетов – изменен шаблон кода на @@@.@@
Поступление товара
Если ВидОперации=перечисления.ВидыОперации.ПриемНаХранение Тогда
РезультатТМЦ = РаботаСДокументаСервер.ПолучитьДанныеПоТМЦ1(Ссылка, Дата, ПланыСчетов.Хозрасчетный.ТМЦпринятыенахранение, Контрагент);
СуммаУслуг = РаботаСДокументаСервер.ПолучитьСуммуУслуг(Ссылка);
ДвиженияПоРегистрамСервер.ДвиженияПоБУ(Движения, РезультатТМЦ);
Если СуммаУслуг>0 Тогда
ДвиженияПоРегистрамСервер.СформироватьПроводкуПоУслугам(Движения, СуммаУслуг, Контрагент, Дата, ПланыСчетов.Хозрасчетный.Поставщики);
КонецЕсли;
иначе
Если УУ Тогда
——-
Функция ПолучитьДанныеПоТМЦ1(Ссылка, Дата, КорСчет, КорСубконто = Неопределено) Экспорт
ИмяТаблицы = “Документ.”+Ссылка.Метаданные().Имя+”.Товары”;
Запрос = Новый Запрос;
Запрос.Текст = “ВЫБРАТЬ
| &Период,
| ДокТовары.Номенклатура КАК СубконтоДт1,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары) КАК ВидСубконтоДт1,
| &ДебСчет КАК СчетДт,
| СУММА(ДокТовары.Количество) КАК КоличествоДт,
| СУММА(ДокТовары.Сумма) КАК Сумма,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты) КАК ВидСубконтоДт2,
| &КорСубконто КАК СубконтоДт2,
| ДокТовары.Ссылка.Организация КАК Организация
|ИЗ
| &ДокументТовары КАК ДокТовары
|ГДЕ
| ДокТовары.Ссылка = &Ссылка
| И ДокТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
|
|СГРУППИРОВАТЬ ПО
| ДокТовары.Номенклатура,
| ДокТовары.Ссылка.Организация”;
Запрос.Текст = СтрЗаменить(Запрос.Текст, “&ДокументТовары”, ИмяТаблицы);
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Период”, Дата);
Запрос.УстановитьПараметр(“Дебсчет”, КорСчет);
Если КорСубконто = Неопределено Тогда
КорВидСубконто = ПланыВидовХарактеристик.ВидыСубконто.ПустаяСсылка();
Иначе
КорВидСубконто = ПланыВидовХарактеристик.ВидыСубконто.Контрагенты;
КонецЕсли;
Запрос.УстановитьПараметр(“КорВидСубконто”, КорВидСубконто);
Запрос.УстановитьПараметр(“КорСубконто”, КорСубконто);
Возврат Запрос.Выполнить();
КонецФункции
Процедура СформироватьПроводкуПоУслугам(Движения, Сумма, Контрагент, Дата, КорСчет, Организ) Экспорт
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Затраты;
Проводка.СчетКт = КорСчет;
Проводка.Организация=Организ;
СубконтоКонтрагенты = ПланыВидовХарактеристик.ВидыСубконто.Контрагенты;
Если КорСчет.ВидыСубконто.Найти(СубконтоКонтрагенты, “ВидСубконто”)<>Неопределено Тогда
Проводка.СубконтоКт[СубконтоКонтрагенты] = Контрагент;
КонецЕсли;
Проводка.Сумма = Сумма;
КонецПроцедуры
Функция ПолучитьСуммуУслуг(Ссылка) Экспорт
ИмяТаблицы = “Документ.”+Ссылка.Метаданные().Имя+”.Товары”;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ISNULL(СУММА(ДокТовары.Сумма),0) КАК Сумма
|ИЗ
| &Товары КАК ДокТовары
|ГДЕ
| ДокТовары.Ссылка = &Ссылка
| И ДокТовары.Ссылка.Организация =&Организация
| И ДокТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)”;
Запрос.Текст = СтрЗаменить(Запрос.Текст, “&Товары”, ИмяТаблицы);
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Организация”, Ссылка.Организация);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
ВыборкаДетальныеЗаписи = Результат.Выбрать();
ВыборкаДетальныеЗаписи.Следующий();
Возврат ВыборкаДетальныеЗаписи.Сумма;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции // Пол
Документ реализации
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если ВидОперации=Перечисления.ВидыОперации.ВозвратСХранения Тогда
ДвиженияПоОстаткамБухВозврат(Отказ);
ДвиженияПоРегистрамУпрВозврат(Отказ);
Иначе
Если УУ Тогда
ДвиженияПоОстаткамУпр(Отказ);
КонецЕсли;
Если БУ Тогда
ДвиженияПоОстаткамБух(Отказ);
КонецЕсли;
КонецЕсли;
Если Не Отказ Тогда
Если УУ Тогда
ДвиженияПоРегистрамУпр(Отказ);
КонецЕсли;
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.Продажи.Записывать = Истина;
Движения.Взаиморасчеты.Записывать = Истина;
Движения.РегистрБухгалтерииХозрасчетный.Записывать = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ДвиженияПоОстаткамБухВозврат(Отказ)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Количество,
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.КоличествоОстатокДт, 0) КАК КоличествоОстаток,
| ЕСТЬNULL(РегистрБухгалтерииХозрасчетныйОстатки.СуммаОстатокДт, 0) КАК СуммаОстаток,
| Товары.Контрагент
|ИЗ
| (ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество) КАК Количество,
| РеализацияТоваровТовары.Ссылка.Контрагент КАК Контрагент
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.Ссылка.Контрагент) КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.РегистрБухгалтерииХозрасчетный.Остатки(
| &МоментВремени,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ТМЦпринятыенахранение),
| ,
| Субконто1 В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТовары.Номенклатура
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга))
| И Субконто2 = &Контрагент) КАК РегистрБухгалтерииХозрасчетныйОстатки
| ПО Товары.Номенклатура = РегистрБухгалтерииХозрасчетныйОстатки.Субконто1”;
Запрос.УстановитьПараметр(“МоментВремени”, МоментВремени());
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Контрагент”, Контрагент);
Результат = Запрос.Выполнить();
ВыборкаТовары= Результат.Выбрать();
Пока ВыборкаТовары.Следующий() Цикл
Нехватка = ВыборкаТовары.Количество – ВыборкаТовары.КоличествоОстаток;
Если Нехватка>0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Нехватка товара “+ВыборкаТовары.Номенклатура+” составляет “+Нехватка+” единиц”;
Сообщение.Сообщить();
КонецЕсли;
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.ТМЦпринятыенахранение;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Товары] = ВыборкаТовары.Номенклатура;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = ВыборкаТовары.Контрагент;
Проводка.КоличествоДт = ВыборкаТовары.Количество;
Если ВыборкаТовары.КоличествоОстаток = 0 Тогда
Проводка.Сумма = ВыборкаТовары.СуммаОстаток;
Иначе
Проводка.Сумма = ВыборкаТовары.Количество*ВыборкаТовары.СуммаОстаток/ВыборкаТовары.КоличествоОстаток;
КонецЕсли;
КонецЦикла;
Проводка = Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = ПланыСчетов.Хозрасчетный.Покупатели;
Проводка.СчетКт = ПланыСчетов.Хозрасчетный.Выручка;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
Проводка.Сумма = СуммаДокумента;
КонецПроцедуры
Процедура ДвиженияПоРегистрамУпрВозврат(Отказ)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура,
| СУММА(РеализацияТоваровТовары.К * РеализацияТоваровТовары.Количество) КАК Количество,
| &Период,
| РеализацияТоваровТовары.Ссылка.Контрагент,
| РеализацияТоваровТовары.Ссылка.Менеджер,
| СУММА(РеализацияТоваровТовары.Сумма) КАК Сумма
|ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
|ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Номенклатура.ВидНоменклатуры = ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
|
|СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваровТовары.Ссылка.Контрагент,
| РеализацияТоваровТовары.Ссылка.Менеджер”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Период”, Дата);
Результат = Запрос.Выполнить();
Движения.Продажи.Загрузить(Результат.Выгрузить());
Запись = Движения.Взаиморасчеты.ДобавитьПриход();
Запись.Период = Дата;
Запись.Контрагент = Контрагент;
Запись.Сумма = СуммаДокумента;
КонецПроцедуры
Документ Авизо.
&НаКлиенте
Процедура СчетПриИзменении(Элемент)
// Вставить содержимое обработчика.
Видимость();
КонецПроцедуры
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
//Вставить содержимое обработчика
Видимость();
КонецПроцедуры
//
&НаСервере
Процедура Видимость()
Макс=Метаданные.ПланыСчетов.Хозрасчетный.МаксКоличествоСубконто;
ТекКол=Объект.Счет.ВидыСубконто.Количество();
Для Сч =1 По Макс Цикл
Если ТекКол>=Сч Тогда
Элементы[“Субконто”+Сч].Видимость=Истина;
Иначе
Элементы[“Субконто”+Сч].Видимость=Ложь;
КонецЕсли;
КонецЦикла;
Элементы.Количество.Видимость=Объект.Счет.Количественный;
КонецПроцедуры // Видимость()
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если Счет.Вид=ВидСчета.Активный или (Счет.Вид=ВидСчета.АктивноПассивный и Сумма>0) Тогда
Проводка= Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период=Дата;
Проводка.СчетДт=ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения]=ПодразделениеПолучатель;
Проводка.СчетКт=Счет;
Для каждого Строка Из Счет.ВидыСубконто Цикл
Проводка.СубконтоКт[Строка.ВидСубконто]=ЭтотОбъект[“Субконто”+Строка.НомерСтроки];
КонецЦикла;
Проводка.Сумма=Сумма;
Если Счет.Количественный Тогда
Проводка.КоличествоКт=Количество;
КонецЕсли;
Проводка.Организация=ПодразделениеОтправитель;
Проводка= Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период=Дата;
Проводка.Организация=ПодразделениеПолучатель;
Проводка.СчетКт=ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения]=ПодразделениеОтправитель;
Проводка.СчетДт=Счет;
Для каждого Строка Из Счет.ВидыСубконто Цикл
Проводка.СубконтоДт[Строка.ВидСубконто]=ЭтотОбъект[“Субконто”+Строка.НомерСтроки];
КонецЦикла;
Проводка.Сумма=Сумма;
Если Счет.Количественный Тогда
Проводка.КоличествоДт=Количество;
КонецЕсли;
Иначе
Проводка= Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период=Дата;
Проводка.СчетКт=ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения]=ПодразделениеПолучатель;
Проводка.СчетДт=Счет;
Для каждого Строка Из Счет.ВидыСубконто Цикл
Проводка.СубконтоДт[Строка.ВидСубконто]=ЭтотОбъект[“Субконто”+Строка.НомерСтроки];
КонецЦикла;
Проводка.Сумма=Сумма;
Если Счет.Количественный Тогда
Проводка.КоличествоДт=Количество;
КонецЕсли;
Проводка.Организация=ПодразделениеОтправитель;
Проводка= Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период=Дата;
Проводка.Организация=ПодразделениеПолучатель;
Проводка.СчетДт=ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения]=ПодразделениеОтправитель;
Проводка.СчетКт=Счет;
Для каждого Строка Из Счет.ВидыСубконто Цикл
Проводка.СубконтоКт[Строка.ВидСубконто]=ЭтотОбъект[“Субконто”+Строка.НомерСтроки];
КонецЦикла;
Проводка.Сумма=Сумма;
Если Счет.Количественный Тогда
Проводка.КоличествоКт=Количество;
КонецЕсли;
КонецЕсли;
Движения.РегистрБухгалтерииХозрасчетный.Записывать=Истина;
КонецПроцедуры
Отчеты выполнил трудностей не возникло
Добрый день!
Удалось сократить отставание почти до 0!
В плане счетов «Хозрасчетный» создан забалансовый счет 002.
Первая сложность – по одному из предыдущих ТЗ маска счета задана как @@.@@ и счет 002 в эту маску «не лезет». Маска данного плана счетов изменена на @@@.@@.
Еще одно изменение пл. счетов «Хозрасчетный» – максимальное количество Субконто увеличено до 2-х – т.к. на счете 002 надо хранить разрез по Товару и по Контрагентам.
В документ «ПоступлениеТоваровУслуг» добавлен реквизит «ВидОперации» и сделаны все необходимые изменение в процедуре «ОбработкаПроведения» модуля объекта документа «ПоступлениеТоваровУслуг».
Изменения кода помечены маркером «ДЗ_12 – 07.06.11»: http://paste.org.ru/?4va303
В документе «РеализацияТоваровУслуг» добавлен реквизит «ВидОперации» и сделаны все необходимые изменения в модуле объекта документа «РеализацияТоваровУслуг».
Изменения кода помечены маркером «ДЗ_12 – 07.06.11»: http://paste.org.ru/?oe45qj
Взял на себя смелость несколько отойти от ДЗ. Сумма выручки при снятии с хранения вычисляется как разность от себестоимости товара, находящегося на хранении и суммы документа, а не на всю сумму документа, как сказано в условии ДЗ.
Создан справочник «Подразделения».
В регистре бухгалтерии «Хозрасчетный» создано измерение «Подразделения».
Во всех документах, за исключением «КонтактСКонтрагентом», создан реквизит «Подразделение».
На форму каждого из этих документов вывел реквизит «Подразделение».
Для документа «ОперацияБух» прописываю Подразделение проводки в модуле набора записей регистра бухгалтерии «Хозрасчетный»: http://paste.org.ru/?bjfy5o ,
для прочих документов – в процедуре обработки проведения, при создании проводок, каждой проводке добавляем заполнение измерения регистра бухгалтерии «Хозрасчетный» из соответствующего реквизита документа.
Кроме этого, в документе «РеализацияТоваровУслуг» контроль остатка также ведется с учетом подразделения.
В документах «Выписка» и «АктСверкиВзаиморасчетов» – введен анализ по подразделению при подсчете задолженностей.
Создан документ «Авизо».
Документ имеет реквизиты «Отправитель» и «Получатель». Оба реквизита имеют тип «СправочникСсылка.Подразделения».
У документа есть табличная часть «ТабЧасть».
Реквизиты табличной части – «Счет», «Субконто1», «Субконто2», «Сумма», «Количество».
Пришлось повозиться с модулем формы данного документа – в части назначения типов субконто. Промучился кучу времени, и так и не смог добиться результата, полностью меня удовлетворяющего. Работает, но работает с огрехами. Грущу: http://paste.org.ru/?4vxxae,
Написал обработку проведения документа «Авизо».
Получилось вот что: http://paste.org.ru/?tpa7w6
На основе схемы компоновки данных созданы отчеты:
– ОСВ;
– Баланс;
– Сравнение количественных остатков БУ и УУ.
Ну и конечно же, обратная связь;)
1) После просмотра данного блока я наконец-то понял как реализована система бухгалтерского учёта в 1С. Понял все взаимосвязи между регистром бухгалтерии, планов счетов и планов видов характеристик. Очень понравилось как в сжатом виде представлена информация по бухгалтерскому учёту, всего один час, а качество просто супер:)
2) Затруднения пожалуй были только при просмотре главы 10 “Сторнирование проводок”, я в какой-то момент потерял нить смысла и пришлось пересматривать вновь и вновь. И хочу пересмотреть ещё, так как есть подозрение что всё равно что-то упустил.
3) Я знаю, что у нас курс по программированию, а не по финансовому анализу, но всё таки:) Я думаю всем интересно будет, если к основным понятием бухгалтерского учёта добавить “Прибыль” и рассмотреть её более шире. Так как наверняка каждый кто имеет дело с 1С, так или иначе сталкивается с этим термином. А зачастую от заказчика можно услышать такое: “Всё что мне нужно от системы так это посчитать прибыль и видеть её изменение оперативно”:) После таких фраз некоторые программисты уходят в ступор и не всегда бухгалтер может объяснить, что хочет она и что нужно собственнику. Поэтому моё предложение более широко рассмотреть, что значит финансовый результат “Прибыль”, как считается, в чем различие между такими терминами как рентабельность, чистая прибыль и может быть ещё какие-нибудь дельные советы для начинающих разработчиков по данному вопросу:)
Домашние задания в 3-ем блоке понравились все без исключения:) Может быть мне так показалось из-за большой любви к бухгалтерскому учёту:)
Спасибо;)
Спасибо за обратную связь.
Пожелание по основам финансового анализа для начинающих записали, спасибо.
Задание выполнил. Сложностей не возникло. Решение ещё не выложили, так что можно считать, что успел вовремя:)
Возник очень интересный момент, в пользовательском режиме система даёт создать счет с кодом 002, но вот когда пытаешься сделать предопределенный элемент в конфигураторе система разрешает только создать счет с кодом 00.2. Я решил, что систему надо обмануть убрал маску добавил предопределенный элемент, затем вновь установил маску и сохранил конфигурацию. При этом всё работало:)
С документом поступления товаров решил все просто, добавил реквизит с типом перечисление “ВидыОперацийПоступления”. Изменил обработку проведения, добавил условия и через запрос к таблице “Товары” загрузил информацию в бухгалтерский регистр.
В документе реализация чуть-чуть по сложнее, но в целом сделал тоже самое что и для документа поступления. Также добавил проверку по остаткам через запрос.
С документом “Авизо”, изрядно потрудился, чтобы он прямо таки блестел. Чтобы при выборе счета, появлялось столько колонок сколько у счета есть субконто. Например, если у счета только одно субконто, то видно только одну колонку “Субконто1”, а если у счета два субконто, то видно и колонку “Субконто1” и “Субконто2”. Вот такой вот получилась обработка проведения:
<code>
Для каждого Строка из Передача Цикл
Если Строка.Счет.Вид=ВидСчета.Активный ИЛИ Строка.Счет.Вид=ВидСчета.АктивноПассивный И Строка.Сумма>0 Тогда
Проводка=Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период=Дата;
Проводка.СчетДт=ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения]=Получатель;
Проводка.СчетКт=СТрока.Счет;
Для каждого Субконто из Строка.Счет.ВидыСубконто Цикл
Номер=”Субконто”+Субконто.НомерСтроки;
Проводка.СубконтоКт[Субконто.ВидСубконто]=Строка[Номер];
КонецЦикла;
Проводка.Сумма=Строка.Сумма;
Если Строка.Количество<>0 Тогда
Проводка.КоличествоКт=Строка.Количество;
КонецЕсли;
Проводка=Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период=Дата;
Проводка.СчетКт=ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения]=Отправитель;
Проводка.СчетДт=СТрока.Счет;
Для каждого Субконто из Строка.Счет.ВидыСубконто Цикл
Номер=”Субконто”+Субконто.НомерСтроки;
Проводка.СубконтоДт[Субконто.ВидСубконто]=Строка[Номер];
КонецЦикла;
Проводка.Сумма=Строка.Сумма;
Если Строка.Количество<>0 Тогда
Проводка.КоличествоДт=Строка.Количество;
КонецЕсли;
Иначе
Проводка=Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период=Дата;
Проводка.СчетКт=ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения]=Получатель;
Проводка.СчетДт=СТрока.Счет;
Для каждого Субконто из Строка.Счет.ВидыСубконто Цикл
Номер=”Субконто”+Субконто.НомерСтроки;
Проводка.СубконтоДт[Субконто.ВидСубконто]=Строка[Номер];
КонецЦикла;
Проводка.Сумма=Строка.Сумма;
Если Строка.Количество<>0 Тогда
Проводка.КоличествоДт=Строка.Количество;
КонецЕсли;
Проводка=Движения.РегистрБухгалтерииХозрасчетный.Добавить();
Проводка.Период=Дата;
Проводка.СчетДт=ПланыСчетов.Хозрасчетный.ОбособленныеПодразделения;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения]=Отправитель;
Проводка.СчетКт=СТрока.Счет;
Для каждого Субконто из Строка.Счет.ВидыСубконто Цикл
Номер=”Субконто”+Субконто.НомерСтроки;
Проводка.СубконтоКт[Субконто.ВидСубконто]=Строка[Номер];
КонецЦикла;
Проводка.Сумма=Строка.Сумма;
Если Строка.Количество<>0 Тогда
Проводка.КоличествоКт=Строка.Количество;
КонецЕсли;
КонецЕсли;
КонецЦикла;
</code>
С ОСВ по счету никаких проблем не возникло, очень быстро реализовал. С отчетом баланс немного повозился, потом пересмотрел видео урок “Разработка отчета “Баланс”” и всё вспомнил:)
С отчетом по остаткам немного нахимичил, но достаточно быстро нашел ошибку, создал полное соединение таблиц по регистру накопления и по бухгалтерскому регистру и всё стало нормально работать:)
Посмотрел решение, исправил своё домашнее задание в части учета по подразделениям. Не правильно понял задание, поэтому немного всё решил не так. Добавил измерение “Подразделение” в регистр бухгалтерии, добавил пару строк в обработку проведения в документ Авизо и поправил отчеты. Спасибо:)
Создан счет 002 забалансовый с субконто «Номенклатура» и «Контрагенты». В документах Поступление товаров и Реализация товаров создан реквизит Вид операции (типы данных – перечисления ВидыПоступлений и ВидыСписания соответственно). Движения по регистрам производятся исходя из выбранного типа документа (обязательный реквизит). При списании контролируется остаток товара по контрагенту на счете 002. В регистр бухгалтерии введено балансовое измерение Подразделение. Создан документ «Авизо». Заполнение производится через реквизиты документа, на основе которых формируются проводки. При выборе счета устанавливаются типы субконто, их доступность и доступность количества. Проводки формируются согласно задания. Отчеты также готовы.
Впервые познакомился с небалансовыми измерениями. Очень интересный пример разработки документа «Сторно». Стало более понятно про формирование стандартных бухгалтерских отчетов, а именно какие таблицы более подходят для каждого из них. Думаю пересмотреть эти уроки еще раз. Интересно, как реализовать открытие детальных бухгалтерских отчетов из сводных: напр. из ОСВ – ОСВ по счету (как в типовых конфигурациях).
У меня тоже очень часто блокировался copy-paste при написании кода в 8.2 и оч странно работала конфа, в один момент даже думала что свою учебную базу потеряла навсегда. И все это было после просмотра защищенных видео. Теперь после просмотра видео перегружаю комп , а затем только работаю в конфе. Очень неудобно.
Использование буфера обмена блокируется во время просмотра защищенного видео. После закрытия .exe файла буфер обмена должен быть доступен.
В качестве обходного решения могу предложить следующее – использовать виртуальную машину для просмотра защищенного видео. В этом случае можно параллельно работать в конфигурации без каких-либо проблем.
Задание выполнено.
Добавлен забалансовый счет, сделаны проводки по БУ аналогично пред урокам.Добавлена проводка по регистру накопления по услугам хранения.
Создан справочник “Подразделения”. Добавлено измерение в регистр Бухгалтерии.
Создан документ “Авизо”. Сделаны проводки док-та по БУ. Для получения “видаСубконта” использовала запрос к ТЧ док-та Авизо с левым соединением с ТЧ планасчетов “ВидыСубконто” ПО счету. Не знаю как сделать, чтобы в форме док-та Авизо в поле Субконто определялся типСубконто в зависимости от выбранного счета.
Сделаны отчеты.
Обратная связь.
Много нового узнала про СКД, ранее мало пользовалась. Много полезного услышала по БУ.
Трудности по прежнему с передачей данных с клиента на сервер и наоборот. С первого раза не сразу получается.
Задание выполнил.
Увеличил до 2 значение МаксимальноеКоличествоСубконто и изменил маску кода @@@.@@.
Добавил Активно/Пассивный, забалансовый счет 002 ТМЦПринятыеНаХранение. Установил флаг
ПризнакУчета количественный и ВидыСубконто Товары и Контрагенты.
Добавил перечисление ВидыОпераций со значениями Покупка и ПриемНаХранение.
Создал в документах ПоступлениеТоваров и РеализацияТоваров реквизит ВидОперации, который может принимать
значения перечисления ВидыОпераций.
При формировании проводок работает такой код:
Дт 002 <Номенклатура>, <Контрагент> Количество Сумма
<code>
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Товары] = Выборка.Номенклатура;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
</code>
Кт 002 <Номенклатура>, <Контрагент> Количество Сумма
<code>
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Товары] = ТекСтрокаТовары.Номенклатура;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты] = Контрагент;
</code>
Сумма вычисляется расчетным путем по данным регистра бухгалтерии – из за этого пришлось
применить старый метод списания.
При проведении реализации необходимо контролировать остаток товара данного
контрагента для этого в параметре Условие виртуальной таблицы РегистрБухгалтерииХозрасчетныйОстатки
введено следующее ограничение:
<code>
(Субконто1, Субконто2) В
(ВЫБРАТЬ РАЗЛИЧНЫЕ
РеализацияТоваровТовары.Номенклатура,
РеализацияТоваровТовары.Ссылка.Контрагент
ИЗ
Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
ГДЕ
РеализацияТоваровТовары.Ссылка = &Ссылка).
</code>
Для организации бухгалтерского учета в разрезе подразделений ввел балансовое измерение Подразделение
тип СправочникСсылка.Подразделения в регистр бухгалтерии и добавил реквизит Подразделение во все документы.
А так же добавил код для заполнения для заполнения этого измерения при формировании проводок.
Создал документ Авизо добавил реквизиты Отправитель и Получатель типа СправочникСсылка.Подразделения,
табличную часть Операции с соответсвующими реквизитами.
В обработчиках ОперацииСчетПриИзменении и ОперацииПриАктивизацииСтроки модуля формы происходит управление доступностью ввода Субконто1, Субконто2 и Количества.
Необходимые для этого данные получаем на сервере:
&НаСервере
Функция КоличествоСубконто(КоррСчет)
Возврат КоррСчет.ВидыСубконто.Количество();
КонецФункции
В свойствах реквизита Субконто1 и Субконто2 настоил СвязьПоТипу Операции.Счет.
Отчет ОборотноСальдоваяВедомость основан на запросе к виртуальной таблице РегистрБухгалтерииХозрасчетныйОстаткиИОбороты.
На закладке ТаблицыИПоля конструктора запроса добавляем условия для Счет в поле УсловиеСчета и для Подразделение в поле Условие.
Отчет Баланс основан на запросе к виртуальной таблице РегистрБухгалтерииХозрасчетныйОстатки.
Добавляем условие для измерения Подразделение в поле Условие.
Отчет ОстаткиБУиУУ основан на объединении запросов к виртуальным таблицам РегистрБухгалтерииХозрасчетныйОстатки и ОстаткиНоменклатурыОстатки.
В поле Субконто таблицы РегистрБухгалтерииХозрасчетныйОстатки накладываем следующее ограничение:
<code>
ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары)
</code>
1. Практически весь материал по Бухгалтерскому учету для меня новый(с позиции программиста).
2. Поначалу шокировало многообразие виртуальных таблиц, но по мере продвижения по курсу
понял что методы работы сними однотипны и просты.
Сделано.
Изменение в Бух.Учете:
В БухРегистр добавлено измерение подразделение:Спрвочник.Подразделения.
В ВИдыСубконто добавлено субконто подразделение.
В план счетов добавлен забалансовый счет 002/Номенклатура/Контраген;
Добавлен счет 79/Подразделение.
В документах: ПриходЪРасход добавлены ВидыОпераций.
Добавлен док. Авизо
шапка: ПодразделениеОтправитель/ПодразделениеПолучатель
ТЧ: Счет/Субконто1/Субконто2/Количество/Сумма
Модуль НабораЗаписей бухРегистра/ПередЗаписью доработан для подстановки Подразделения.
Старые модули доработаны для формирования “забалансовых” проводок по счету 002, с анализом остатков.
Особое “удовольствие” доставила Обработка проведения Авизо. Удалось написать запрос для загрузки Движений Авизо по Бухрегистру в стиле: Движения.Хозрасчетный.Загрузить(Запрос.Выполнить().Выгрузить())
По прежнему трудно даются отчеты СКД.
По поводу 3 блока в целом. Самое тяжелое это защищенное видео в “формате” EXE. Подтверждается “народная” мудрость, что всякая защита работает против честных владельцев. Сложилось так, что я просматривал его на нескольких разных “чужих” компах. Везде свои чудеса. Где запускается по 2 минуты, где антивирусы/файерволы ловят exe’шник на “сомнительных” действиях. Где со словами “интерфейс не поддерживается” exe’шник не завершается и остается в памяти. А самое замечательное это блокировка clipboard’a и периодическое падение 8’ки при висящем exe’шнике. И все это при том, что видео достаточно просто из него(exe’шника) списывается. По существу предметной области(бух.учета в 8’ке) на все вопросы получил ответы в мастер группе и уч.материалах. Спасибо.
При выполнении задания больших трудностей не возникало, за исключением реализации заполнения табличной части документа «Авизо». Все же после долгих усилий заполнение приняло вполне приличный вид. Для того, чтобы поменьше обращаться к серверу, добавил в табличную часть «Состав» невидимые для пользователя реквизиты «Количественный» (булево) и «КоличествоСубконто» (число), хранящие соответствующие свойства выбранного счета. У реквизитов «Субконто1» и «Субконто2» табличной части установил связь по типу с реквизитом «Счет». В модуле формы документа описал события ПриИзменении поля формы «СоставСчет» и Выбор таблицы формы «Состав»:
<code>
&НаКлиенте
Процедура СоставСчетПриИзменении(Элемент)
ТД = Элементы.Состав.ТекущиеДанные;
ПараметрыСчета = ПолучитьПараметрыСчета(ТД.Счет);
ТД.Количественный = ПараметрыСчета.Количественный;
ТД.КоличествоСубконто = ПараметрыСчета.КоличествоСубконто;
Если Не ТД.Количественный Тогда
ТД.Количество = 0;
Элементы.Состав.ПодчиненныеЭлементы.СоставКоличество.ТолькоПросмотр = Истина;
Иначе
Элементы.Состав.ПодчиненныеЭлементы.СоставКоличество.ТолькоПросмотр = Ложь;
КонецЕсли;
Если ТД.КоличествоСубконто = 0 Тогда
Элементы.Состав.ПодчиненныеЭлементы.СоставСубконто1.ТолькоПросмотр = Истина;
Элементы.Состав.ПодчиненныеЭлементы.СоставСубконто2.ТолькоПросмотр = Истина;
ИначеЕсли ТД.КоличествоСубконто = 1 Тогда
Элементы.Состав.ПодчиненныеЭлементы.СоставСубконто1.ТолькоПросмотр = Ложь;
Элементы.Состав.ПодчиненныеЭлементы.СоставСубконто2.ТолькоПросмотр = Истина;
ИначеЕсли ТД.КоличествоСубконто > 1 Тогда
Элементы.Состав.ПодчиненныеЭлементы.СоставСубконто1.ТолькоПросмотр = Ложь;
Элементы.Состав.ПодчиненныеЭлементы.СоставСубконто2.ТолькоПросмотр = Ложь;
КонецЕсли;
КонецПроцедуры
&НаСервереБезКонтекста
Функция ПолучитьПараметрыСчета(Счет)
ПараметрыСчета = Новый Структура;
ПараметрыСчета.Вставить(“Количественный”, Счет.Количественный);
ПараметрыСчета.Вставить(“КоличествоСубконто”, Счет.ВидыСубконто.Количество());
Возврат ПараметрыСчета;
КонецФункции // ПолучитьПараметрыСчета()
&НаКлиенте
Процедура СоставВыбор(Элемент, ВыбраннаяСтрока, Поле, СтандартнаяОбработка)
ТД = Элементы.Состав.ТекущиеДанные;
Если Поле.Имя = “СоставКоличество” Тогда
Если Не ТД.Количественный Тогда
Поле.ТолькоПросмотр = Истина;
Иначе
Поле.ТолькоПросмотр = Ложь;
КонецЕсли;
КонецЕсли;
Если Поле.Имя = “СоставСубконто1” Тогда
Если ТД.КоличествоСубконто = 0 Тогда
Поле.ТолькоПросмотр = Истина;
ИначеЕсли ТД.КоличествоСубконто > 0 Тогда
Поле.ТолькоПросмотр = Ложь;
КонецЕсли;
КонецЕсли;
Если Поле.Имя = “СоставСубконто2” Тогда
Если ТД.КоличествоСубконто < 2 Тогда
Поле.ТолькоПросмотр = Истина;
ИначеЕсли ТД.КоличествоСубконто > 1 Тогда
Поле.ТолькоПросмотр = Ложь;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
</code>
Заданиевыполнил.
Добавил 2-е субконто к плану счетов
Видимо, неправильно понял задание и во всех регистрах и документах добавил Подразделение. Соответственно под это переделал все запросы- добавлял отбор по Подразделению в параметры виртуальных таблиц.
В Авизо связь по типу Субконто1 и Субконто2 в форме сделал через ПривестиЗначение
Отчеты получились быстро, только потратил немного времени на вывод итогов в Балансе.
Текст запроса отчета Баланс:
ВЫБРАТЬ
ХозрасчетныйОстатки.Счет КАК Счет,
ХозрасчетныйОстатки.СуммаОстаток КАК Сумма,
“Актив” КАК ВидБаланса
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(, (НЕ Счет.Забалансовый), , {(Подразделение)}) КАК ХозрасчетныйОстатки
ГДЕ
ХозрасчетныйОстатки.СуммаОстаток > 0
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ХозрасчетныйОстатки.Счет,
-ХозрасчетныйОстатки.СуммаОстаток,
“Пассив”
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(, (НЕ Счет.Забалансовый), , ) КАК ХозрасчетныйОстатки
ГДЕ
ХозрасчетныйОстатки.СуммаОстаток < 0
Текст запроса Отчета по остаткам БУ и УУ:
ВЫБРАТЬ
ОстаткиБУ.КоличествоОстаток КАК КоличествоБУ,
ОстаткиБУ.Номенклатура,
0 КАК КоличествоУУ
ИЗ
(ВЫБРАТЬ
ХозрасчетныйОстатки.Субконто1 КАК Номенклатура,
ХозрасчетныйОстатки.КоличествоОстаток КАК КоличествоОстаток
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(, , , Субконто1 ССЫЛКА Справочник.Номенклатура) КАК ХозрасчетныйОстатки
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
ХозрасчетныйОстатки.Субконто2,
ХозрасчетныйОстатки.КоличествоОстаток
ИЗ
РегистрБухгалтерии.Хозрасчетный.Остатки(, , , Субконто2 ССЫЛКА Справочник.Номенклатура) КАК ХозрасчетныйОстатки) КАК ОстаткиБУ
ОБЪЕДИНИТЬ ВСЕ
ВЫБРАТЬ
0,
ОстаткиНоменклатурыОстатки.Номенклатура,
ОстаткиНоменклатурыОстатки.КоличествоОстаток
ИЗ
РегистрНакопления.ОстаткиНоменклатуры.Остатки КАК ОстаткиНоменклатурыОстатки
Задание выполнено.
1) Добавлены счета и аналитики. Перечисления “ВидыОперацийПоступление”, “ВидыОперацийРасход”.
Реквизиты документов с данным типом выведены на форму, сделаны обязательными.
В док. “ПоступлениеТоваров” добавлены проводки по счету “002”, как требовалось в задании.
В док. “РеализацияТоваров” – проведение по “старому” с очисткой движений перед запросом.
<code>
//проведение по БУ
Процедура ПровестиПоБУ(Движения, Отказ, ВозвратПринятыхНаОХТоваров)
ДвиженияРегистрБухгалтерииРабочий = Движения.РегистрБухгалтерииРабочий;
ДвиженияРегистрБухгалтерииРабочий.Записать(); //очищаем движения! 13 ошибок!!!
</code>
2)Новый справочник “ОбособленныеПодразделения” с иерархией элементов.
В регистр бухгалтерии добавил балансовое измерение “Подразделение” с данным типом.
Заполнение обязательное. Добавил во все запросы и проводки данный разрез.
3)Документ “Авизо” (шапка:”ПодразделениеОтправитель”,”ПодразделениеПолучатель”)
с таб. частью “Проводки” (рекв.:”Счет”,”Субконто1″,”Субконто2″,”Сумма”,”Количество”).
Тип “Субконто1″,”Субконто2” – “Характеристика.ВидыСубконто”.
Элементам формы убрал галочку “ВыбиратьТип”.
В форме документа ограничиваю типы присвоением пустого значения нужного типа:
<code>
&НаКлиенте
Процедура ПроводкиСчетПриИзменении(Элемент)
ТекущиеДанные = Элементы.Проводки.ТекущиеДанные;
Счет = ТекущиеДанные.Счет;
МассивТиповСубконто = УстановитьТипСубконто(Счет);
Для сч=1 По 2 Цикл
Если ТипЗнч(МассивТиповСубконто[Сч-1])=Тип(“ОписаниеТипов”) Тогда
ТекущиеДанные[“Субконто”+Сч] = МассивТиповСубконто[Сч-1].ПривестиЗначение();
Иначе
ТекущиеДанные[“Субконто”+Сч] = Неопределено;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
&НаСервереБезКонтекста
Функция УстановитьТипСубконто(Счет)
Массив = Новый Массив();
Для каждого Строка Из Счет.ВидыСубконто Цикл
Массив.Добавить(Строка.ВидСубконто.ТипЗначения);
КонецЦикла;
Доп = Макс(0, 2-Массив.Количество());
Для сч=1 По Доп Цикл
Массив.Добавить(Неопределено);
КонецЦикла;
Возврат Массив;
КонецФункции
</code>
Модуль объекта “Авизо”:
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
ДвиженияРегистрБухгалтерииРабочий = Движения.РегистрБухгалтерииРабочий;
ДвиженияРегистрБухгалтерииРабочий.Записывать = Истина;
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| ВложЗапрос.Счет,
| МАКСИМУМ(ВложЗапрос.Субконто1) КАК Субконто1,
| МАКСИМУМ(ВложЗапрос.Субконто2) КАК Субконто2,
| ВложЗапрос.Сумма,
| ВложЗапрос.Количество,
| ВложЗапрос.Дата,
| ВложЗапрос.ПодразделениеОтправитель,
| ВложЗапрос.ПодразделениеПолучатель,
| ВложЗапрос.Сч79,
| ВложЗапрос.ВидСчета,
| ВложЗапрос.СчетКоличественный,
| ВЫБОР
| КОГДА РабочийВидыСубконто.НомерСтроки = 1
| ТОГДА РабочийВидыСубконто.ВидСубконто
| ИНАЧЕ NULL
| КОНЕЦ КАК ВидСубконто1,
| ВЫБОР
| КОГДА РабочийВидыСубконто.НомерСтроки = 2
| ТОГДА РабочийВидыСубконто.ВидСубконто
| ИНАЧЕ NULL
| КОНЕЦ КАК ВидСубконто2
|ИЗ
| (ВЫБРАТЬ
| АвизоПроводки.Счет КАК Счет,
| АвизоПроводки.Субконто1 КАК Субконто1,
| АвизоПроводки.Субконто2 КАК Субконто2,
| СУММА(АвизоПроводки.Сумма) КАК Сумма,
| СУММА(АвизоПроводки.Количество) КАК Количество,
| АвизоПроводки.Ссылка.Дата КАК Дата,
| АвизоПроводки.Ссылка.ПодразделениеОтправитель КАК ПодразделениеОтправитель,
| АвизоПроводки.Ссылка.ПодразделениеПолучатель КАК ПодразделениеПолучатель,
| ЗНАЧЕНИЕ(ПланСчетов.Рабочий.ОбособленныеПодразделения) КАК Сч79,
| АвизоПроводки.Счет.Вид КАК ВидСчета,
| АвизоПроводки.Счет.Количественный КАК СчетКоличественный
| ИЗ
| Документ.Авизо.Проводки КАК АвизоПроводки
| ГДЕ
| АвизоПроводки.Ссылка = &Ссылка
|
| СГРУППИРОВАТЬ ПО
| АвизоПроводки.Счет,
| АвизоПроводки.Субконто1,
| АвизоПроводки.Субконто2,
| АвизоПроводки.Ссылка.Дата,
| АвизоПроводки.Ссылка.ПодразделениеОтправитель,
| АвизоПроводки.Ссылка.ПодразделениеПолучатель,
| АвизоПроводки.Счет.Вид,
| АвизоПроводки.Счет.Количественный
|
| ИМЕЮЩИЕ
| СУММА(АвизоПроводки.Сумма) <> 0) КАК ВложЗапрос
| ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Рабочий.ВидыСубконто КАК РабочийВидыСубконто
| ПО ВложЗапрос.Счет = РабочийВидыСубконто.Ссылка
|
|СГРУППИРОВАТЬ ПО
| ВЫБОР
| КОГДА РабочийВидыСубконто.НомерСтроки = 1
| ТОГДА РабочийВидыСубконто.ВидСубконто
| ИНАЧЕ NULL
| КОНЕЦ,
| ВложЗапрос.Счет,
| ВложЗапрос.Дата,
| ВложЗапрос.ПодразделениеОтправитель,
| ВложЗапрос.ПодразделениеПолучатель,
| ВложЗапрос.Сч79,
| ВложЗапрос.ВидСчета,
| ВложЗапрос.СчетКоличественный,
| ВЫБОР
| КОГДА РабочийВидыСубконто.НомерСтроки = 2
| ТОГДА РабочийВидыСубконто.ВидСубконто
| ИНАЧЕ NULL
| КОНЕЦ,
| ВложЗапрос.Сумма,
| ВложЗапрос.Количество”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
Если Результат.Пустой() Тогда
Возврат;
КонецЕсли;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сч79 = Выборка.Сч79;
СубконтоПодразделение = ПланыВидовХарактеристик.ВидыСубконто.ОбособленноеПодразделение;
ТекВидСчета = Выборка.ВидСчета;
Количественный = Выборка.СчетКоличественный;
Сумма = Выборка.Сумма;
Если ТекВидСчета = ВидСчета.Активный ИЛИ (ТекВидСчета = ВидСчета.АктивноПассивный И Сумма>0) Тогда
//Вариант 1
//новая проводка
Движение = ДвиженияРегистрБухгалтерииРабочий.Добавить();
Движение.Подразделение = Выборка.ПодразделениеОтправитель;
Движение.Период = Выборка.Дата;
Движение.СчетДт = Сч79;
Движение.СубконтоДт[СубконтоПодразделение] = Выборка.ПодразделениеПолучатель;
Движение.СчетКт = Выборка.Счет;
Если НЕ Выборка.ВидСубконто1 = Null Тогда
Движение.СубконтоКт[Выборка.ВидСубконто1] = Выборка.Субконто1;
КонецЕсли;
Если НЕ Выборка.ВидСубконто2 = Null Тогда
Движение.СубконтоКт[Выборка.ВидСубконто2] = Выборка.Субконто2;
КонецЕсли;
Движение.Сумма = Выборка.Сумма;
Если Количественный Тогда
Движение.КоличествоКт = Выборка.Количество;
КонецЕсли;
//новая проводка
Движение = ДвиженияРегистрБухгалтерииРабочий.Добавить();
Движение.Подразделение = Выборка.ПодразделениеПолучатель;
Движение.Период = Выборка.Дата;
Движение.СчетКт = Сч79;
Движение.СубконтоКт[СубконтоПодразделение] = Выборка.ПодразделениеОтправитель;
Движение.СчетДт = Выборка.Счет;
Если НЕ Выборка.ВидСубконто1 = Null Тогда
Движение.СубконтоДт[Выборка.ВидСубконто1] = Выборка.Субконто1;
КонецЕсли;
Если НЕ Выборка.ВидСубконто2 = Null Тогда
Движение.СубконтоДт[Выборка.ВидСубконто2] = Выборка.Субконто2;
КонецЕсли;
Движение.Сумма = Выборка.Сумма;
Если Количественный Тогда
Движение.КоличествоДт = Выборка.Количество;
КонецЕсли;
ИначеЕсли ТекВидСчета = ВидСчета.Пассивный ИЛИ (ТекВидСчета = ВидСчета.АктивноПассивный И Сумма<0) Тогда
//Вариант 2
//новая проводка
Движение = ДвиженияРегистрБухгалтерииРабочий.Добавить();
Движение.Подразделение = Выборка.ПодразделениеОтправитель;
Движение.Период = Выборка.Дата;
Движение.СчетКт = Сч79;
Движение.СубконтоКт[СубконтоПодразделение] = Выборка.ПодразделениеПолучатель;
Движение.СчетДт = Выборка.Счет;
Если НЕ Выборка.ВидСубконто1 = Null Тогда
Движение.СубконтоДт[Выборка.ВидСубконто1] = Выборка.Субконто1;
КонецЕсли;
Если НЕ Выборка.ВидСубконто2 = Null Тогда
Движение.СубконтоДт[Выборка.ВидСубконто2] = Выборка.Субконто2;
КонецЕсли;
Движение.Сумма = Выборка.Сумма;
Если Количественный Тогда
Движение.КоличествоДт = Выборка.Количество;
КонецЕсли;
//новая проводка
Движение = ДвиженияРегистрБухгалтерииРабочий.Добавить();
Движение.Подразделение = Выборка.ПодразделениеПолучатель;
Движение.Период = Выборка.Дата;
Движение.СчетДт = Сч79;
Движение.СубконтоДт[СубконтоПодразделение] = Выборка.ПодразделениеОтправитель;
Движение.СчетКт = Выборка.Счет;
Если НЕ Выборка.ВидСубконто1 = Null Тогда
Движение.СубконтоКт[Выборка.ВидСубконто1] = Выборка.Субконто1;
КонецЕсли;
Если НЕ Выборка.ВидСубконто2 = Null Тогда
Движение.СубконтоКт[Выборка.ВидСубконто2] = Выборка.Субконто2;
КонецЕсли;
Движение.Сумма = Выборка.Сумма;
Если Количественный Тогда
Движение.КоличествоКт = Выборка.Количество;
КонецЕсли;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ПриЗаписи(Отказ)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| АвизоПроводки.НомерСтроки
|ИЗ
| Документ.Авизо.Проводки КАК АвизоПроводки
|ГДЕ
| АвизоПроводки.Ссылка = &Ссылка
| И АвизоПроводки.Счет.Забалансовый”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
Если НЕ Результат.Пустой() Тогда
Отказ = Истина;
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Нельзя выбирать забалансовый счет!”;
Сообщение.Поле = “Проводки[“+(Выборка.НомерСтроки-1)+”].Счет”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
КонецЦикла;
КонецЕсли;
КонецПроцедуры
</code>
4)Отчеты – без проблем. Отборы вывел в пользовательские настройки.
В таб. “Остатки” выражение периода “ДобавитьКДате(&Период, “Секунда”,1)”.
В балансе использовал “ВЫБОР”.
В отчете “ОстаткиУУ и БУ” – два набора данных.
Условие в запросе к БУ на параметр вирт. таб. “Субконто”
<code>
ВЫБРАТЬ
РегистрБухгалтерииРабочийОстатки.Субконто1 Товар,
РегистрБухгалтерииРабочийОстатки.КоличествоОстаток КАК КоличествоБУ
ИЗ
РегистрБухгалтерии.РегистрБухгалтерииРабочий.Остатки(, , ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Номенклатура), ) КАК РегистрБухгалтерииРабочийОстатки
</code>
5)По 3 блоку БК:
а)Нового узнал прилично. Мой конек был опер. учет, хотя теорию БУ знаю.
Понял когда какие галочки ставить, когда и как исп. признаки учета, балансовые ресурсы и измерения.
По СКД есть новое, работа с ним стала намного более предсказуемо!
б)Затруднений особых не было, хотя…
В уроках тема документа “Сторно”, да еще по регистрам сведений – круто вы, с нами!
в)Хотелось бы подробнее про быстродействие, но это, наверное, тема продвинутого курса.
Почему нельзя использовать примитивные типы в измерениях,
почему больше 4-х уровней субконто плохо. Хотя, не скрою, Чистов тоже помог;)
Там четко про индексы рассказано, что хорошо бы осветить и у вас.
У нас это в Продвинутом :)
Обнаружил, что в отч. ост. УУ и БУ нужно было делать полное соединение. Связи наборов данных в СКД – левое соединение, так?
Связи наборов в СКД построены по левому соединению.
Но Вам ничего не мешает связать данные на уровне запроса, а не на уровне СКД (у Вам будет один набор данных).
Спасибо, я так и сделал. Теперь запомню!
Обратная связь по третьему блоку.
1) Динамическое построение текста запроса, был впечатлён!
2) Затруднений вроде не было, с запросами стало получше )))
3) В мастер-группу конечно СКД, там наверное целый мини-курс получится.
Тему СКД полностью разбираем в курсе продвинутом.
ну и хорошо, расчитываю с 4-го июля присоединиться ))
МодульОбъекта поступление товаров
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Если ВидОперации=Перечисления.ВидОперации.ПриемНаХранение тогда УУ=Ложь;
БУ=Ложь;
Запрос=Новый Запрос;
Запрос.Текст= “ВЫБРАТЬ
| &Период,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары) КАК ВидСубконтоДт1,
| ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты) КАК ВидСубконтоДт2,
| ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ТМЦпринятыенахранение) КАК СчетДт,
| ДокТовары.Номенклатура КАК СубконтоДт1,
| СУММА(ДокТовары.Количество) КАК КоличествоДт,
| СУММА(ДокТовары.Сумма) КАК Сумма,
| ПоступлениеТоваров.Контрагент КАК СубконтоДт2
|ИЗ
| Документ.ПоступлениеТоваров.Товары КАК ДокТовары
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров КАК ПоступлениеТоваров
| ПО ДокТовары.Ссылка = ПоступлениеТоваров.Ссылка
|ГДЕ
| ДокТовары.Ссылка = &Ссылка
| И ДокТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга)
|
|СГРУППИРОВАТЬ ПО
| ДокТовары.Номенклатура,
| ПоступлениеТоваров.Контрагент”;
Запрос.УстановитьПараметр(“Период”,Дата);
Запрос.УстановитьПараметр(“Ссылка”,Ссылка);
РезультатЗабаланс=Запрос.Выполнить();
Движения.РегистрБухгалтерииХозрасчетный.Загрузить(РезультатЗабаланс.Выгрузить());
КонецЕсли;
Если УУ Тогда
РезультатОстаткиТоваров = РаботаСДокументаСервер.ПолучитьДанныеПоТоварамДокумента(Ссылка, Дата);
РезультатЗакупки = РаботаСДокументаСервер.ПолучитьДанныеПоНоменклатуреДокумента(Ссылка, Дата, Контрагент);
ДвиженияПоРегистрамСервер.ДвиженияПоНоменклатуре(Движения, РезультатОстаткиТоваров, РезультатЗакупки);
Запись = Движения.Взаиморасчеты.ДобавитьРасход();
Запись.Период = Дата;
Запись.Контрагент = Контрагент;
Запись.Сумма = СуммаДокумента;
КонецЕсли;
Если БУ Тогда
РезультатТМЦ = РаботаСДокументаСервер.ПолучитьДанныеПоТМЦДокумента(Ссылка, Дата, ПланыСчетов.Хозрасчетный.Поставщики, Контрагент);
СуммаУслуг = РаботаСДокументаСервер.ПолучитьСуммуУслуг(Ссылка);
ДвиженияПоРегистрамСервер.ДвиженияПоБУ(Движения, РезультатТМЦ);
Если СуммаУслуг>0 Тогда
ДвиженияПоРегистрамСервер.СформироватьПроводкуПоУслугам(Движения, СуммаУслуг, Контрагент, Дата, ПланыСчетов.Хозрасчетный.Поставщики);
КонецЕсли;
КонецЕсли;
Если НЕ Отказ Тогда
Движения.Взаиморасчеты.Записывать = Истина;
Движения.ОстаткиНоменклатуры.Записывать = Истина;
Движения.Закупки.Записывать = Истина;
Движения.РегистрБухгалтерииХозрасчетный.Записывать = Истина;
КонецЕсли;
КонецПроцедуры
Процедура ОбработкаПроведения(Отказ, РежимПроведения) Если ВидОперации=Перечисления.ВидОперации.ПриемНаХранение тогда УУ=Ложь; БУ=Ложь; Запрос=Новый Запрос; Запрос.Текст= “ВЫБРАТЬ | &Период, | ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары) КАК ВидСубконтоДт1, | ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты) КАК ВидСубконтоДт2, | ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ТМЦпринятыенахранение) КАК СчетДт, | ДокТовары.Номенклатура КАК СубконтоДт1, | СУММА(ДокТовары.Количество) КАК КоличествоДт, | СУММА(ДокТовары.Сумма) КАК Сумма, | ПоступлениеТоваров.Контрагент КАК СубконтоДт2 |ИЗ | Документ.ПоступлениеТоваров.Товары КАК ДокТовары | ЛЕВОЕ СОЕДИНЕНИЕ Документ.ПоступлениеТоваров КАК ПоступлениеТоваров | ПО ДокТовары.Ссылка = ПоступлениеТоваров.Ссылка |ГДЕ | ДокТовары.Ссылка = &Ссылка | И ДокТовары.Номенклатура.ВидНоменклатуры <> ЗНАЧЕНИЕ(Перечисление.ВидыНоменклатуры.Услуга) | |СГРУППИРОВАТЬ ПО | ДокТовары.Номенклатура, | ПоступлениеТоваров.Контрагент”; Запрос.УстановитьПараметр(“Период”,Дата); Запрос.УстановитьПараметр(“Ссылка”,Ссылка); РезультатЗабаланс=Запрос.Выполнить(); Движения.РегистрБухгалтерииХозрасчетный.Загрузить(РезультатЗабаланс.Выгрузить());
КонецЕсли; Если УУ Тогда РезультатОстаткиТоваров = РаботаСДокументаСервер.ПолучитьДанныеПоТоварамДокумента(Ссылка, Дата); РезультатЗакупки = РаботаСДокументаСервер.ПолучитьДанныеПоНоменклатуреДокумента(Ссылка, Дата, Контрагент); ДвиженияПоРегистрамСервер.ДвиженияПоНоменклатуре(Движения, РезультатОстаткиТоваров, РезультатЗакупки); Запись = Движения.Взаиморасчеты.ДобавитьРасход(); Запись.Период = Дата; Запись.Контрагент = Контрагент; Запись.Сумма = СуммаДокумента; КонецЕсли; Если БУ Тогда РезультатТМЦ = РаботаСДокументаСервер.ПолучитьДанныеПоТМЦДокумента(Ссылка, Дата, ПланыСчетов.Хозрасчетный.Поставщики, Контрагент); СуммаУслуг = РаботаСДокументаСервер.ПолучитьСуммуУслуг(Ссылка); ДвиженияПоРегистрамСервер.ДвиженияПоБУ(Движения, РезультатТМЦ); Если СуммаУслуг>0 Тогда ДвиженияПоРегистрамСервер.СформироватьПроводкуПоУслугам(Движения, СуммаУслуг, Контрагент, Дата, ПланыСчетов.Хозрасчетный.Поставщики); КонецЕсли; КонецЕсли; Если НЕ Отказ Тогда Движения.Взаиморасчеты.Записывать = Истина; Движения.ОстаткиНоменклатуры.Записывать = Истина; Движения.Закупки.Записывать = Истина; Движения.РегистрБухгалтерииХозрасчетный.Записывать = Истина; КонецЕсли; КонецПроцедуры
</code>
Реализация по анологии .
Документ Авизо
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Активный=ПланыСчетов.Хозрасчетный.Товары.Вид;
Пассивный=ПланыСчетов.Хозрасчетный.Выручка.Вид;
АктивноПассивный=ПланыСчетов.Хозрасчетный.Поставщики.Вид;
Запрос=Новый Запрос;
Запрос.Текст=”ВЫБРАТЬ
| &Период,
| ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Активный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма > 0
| ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ОбособленныеПодразделения)
| ИНАЧЕ ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Пассивный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма < 0
| ТОГДА АвизоТабличнаяЧасть1.Счет
| КОНЕЦ
| КОНЕЦ КАК СчетДт,
| ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Активный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма > 0
| ТОГДА АвизоТабличнаяЧасть1.Счет
| ИНАЧЕ ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Пассивный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма < 0
| ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ОбособленныеПодразделения)
| КОНЕЦ
| КОНЕЦ КАК СчетКт,
| ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Активный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма > 0
| ТОГДА Авизо.Подразделение2
| КОНЕЦ КАК ПодразделенияДт,
| ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Пассивный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма < 0
| ТОГДА Авизо.Подразделение2
| КОНЕЦ КАК ПодразделенияКт,
| СУММА(АвизоТабличнаяЧасть1.Сумма) КАК Сумма,
| ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Активный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма > 0
| ТОГДА ВЫБОР
| КОГДА ТИПЗНАЧЕНИЯ(АвизоТабличнаяЧасть1.Субконто1) = ТИП(Справочник.Номенклатура)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары)
| ИНАЧЕ ВЫБОР
| КОГДА ТИПЗНАЧЕНИЯ(АвизоТабличнаяЧасть1.Субконто1) = ТИП(Справочник.Контрагенты)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| КОНЕЦ
| КОНЕЦ
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| КОНЕЦ КАК ВидСубконтоКт1,
| ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Активный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма > 0
| ТОГДА ВЫБОР
| КОГДА ТИПЗНАЧЕНИЯ(АвизоТабличнаяЧасть1.Субконто2) = ТИП(Справочник.Номенклатура)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары)
| ИНАЧЕ ВЫБОР
| КОГДА ТИПЗНАЧЕНИЯ(АвизоТабличнаяЧасть1.Субконто2) = ТИП(Справочник.Контрагенты)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| КОНЕЦ
| КОНЕЦ
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| КОНЕЦ КАК ВидСубконтоКт2,
| ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Активный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма > 0
| ТОГДА АвизоТабличнаяЧасть1.Субконто1
| КОНЕЦ КАК СубконтоКт1,
| ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Активный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма > 0
| ТОГДА АвизоТабличнаяЧасть1.Субконто2
| КОНЕЦ КАК СубконтоКт2
|ИЗ
| Документ.Авизо.ТабличнаяЧасть1 КАК АвизоТабличнаяЧасть1
| ЛЕВОЕ СОЕДИНЕНИЕ Документ.Авизо КАК Авизо
| ПО АвизоТабличнаяЧасть1.Ссылка = Авизо.Ссылка
|ГДЕ
| АвизоТабличнаяЧасть1.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Активный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма > 0
| ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ОбособленныеПодразделения)
| ИНАЧЕ ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Пассивный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма < 0
| ТОГДА АвизоТабличнаяЧасть1.Счет
| КОНЕЦ
| КОНЕЦ,
| ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Активный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма > 0
| ТОГДА АвизоТабличнаяЧасть1.Счет
| ИНАЧЕ ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Пассивный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма < 0
| ТОГДА ЗНАЧЕНИЕ(ПланСчетов.Хозрасчетный.ОбособленныеПодразделения)
| КОНЕЦ
| КОНЕЦ,
| ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Активный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма > 0
| ТОГДА Авизо.Подразделение2
| КОНЕЦ,
| ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Пассивный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма < 0
| ТОГДА Авизо.Подразделение2
| КОНЕЦ,
| ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Активный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма > 0
| ТОГДА АвизоТабличнаяЧасть1.Субконто1
| КОНЕЦ,
| ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Активный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма > 0
| ТОГДА АвизоТабличнаяЧасть1.Субконто2
| КОНЕЦ,
| ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Активный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма > 0
| ТОГДА ВЫБОР
| КОГДА ТИПЗНАЧЕНИЯ(АвизоТабличнаяЧасть1.Субконто1) = ТИП(Справочник.Номенклатура)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары)
| ИНАЧЕ ВЫБОР
| КОГДА ТИПЗНАЧЕНИЯ(АвизоТабличнаяЧасть1.Субконто1) = ТИП(Справочник.Контрагенты)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| КОНЕЦ
| КОНЕЦ
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| КОНЕЦ,
| ВЫБОР
| КОГДА АвизоТабличнаяЧасть1.Счет.Вид = &Активный
| ИЛИ АвизоТабличнаяЧасть1.Счет.Вид = &АктивноПассивный
| И АвизоТабличнаяЧасть1.Сумма > 0
| ТОГДА ВЫБОР
| КОГДА ТИПЗНАЧЕНИЯ(АвизоТабличнаяЧасть1.Субконто2) = ТИП(Справочник.Номенклатура)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Товары)
| ИНАЧЕ ВЫБОР
| КОГДА ТИПЗНАЧЕНИЯ(АвизоТабличнаяЧасть1.Субконто2) = ТИП(Справочник.Контрагенты)
| ТОГДА ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Контрагенты)
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| КОНЕЦ
| КОНЕЦ
| ИНАЧЕ ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.ПустаяСсылка)
| КОНЕЦ” ;
Запрос.УстановитьПараметр(“Период”,Дата);
Запрос.УстановитьПараметр(“Ссылка”,Ссылка);
Запрос.УстановитьПараметр(“Активный”,Активный);
Запрос.УстановитьПараметр(“Пассивный”,Пассивный);
Запрос.УстановитьПараметр(“АктивноПассивный”,АктивноПассивный);
Результат=Запрос.Выполнить();
Таблица=Результат.Выгрузить();
Движения.РегистрБухгалтерииХозрасчетный.Загрузить(Таблица);
Движения.РегистрБухгалтерииХозрасчетный.Записывать = Истина;
КонецПроцедуры
</code>
Вторая проводка делается вторым запросом по аналогии.
С отчетами проблем не возникло.
Обратная связь:
Весь материал для меня новый, изложен предельно лаконично, при появлении трудностей достаточно переслушать нужные уроки и все становится на свои места.
Наибольшие затруднения с аналитикой в документе Авизо. Мой вариант с запросом далек от универсальности, мне кажется без него куда проще задача решается, но поставил для себа такую цель.Хотелось бы увидеть решение.
Задание выполнил.
1. Реализовал функционал отв.хранения товаров на забалансовом счете 002 (активный, кол.учет, два субконто) с контролем остатков на этом счете при реализации.
2. Для реализации возможности независимого учета в подразделениях добавил балансовое измерение «Подразделение» в регистр БУ.Для передачи активов создал счет 79 (активно-пассивный) с субконто «Подразделение», остальное – по заданию.
3. В отчете «Остатки БУ и УУ» источником данных СКД является запрос к двум таблицам («РегистрБухгалтерии.Управленческий.Остатки» и «РегистрНакопления.ОстаткиТоваров.Остатки» ) и их объединение.
По 3-ему блоку:
1.Узнал как правильно применять параметры виртуальных таблиц, углубил знания по чтению данных из регистра бухгалтерии.
2.Больше всего трудностей вызывало применение виртуальных таблиц и собственно настройки в СКД.
3.Настройки в СКД.
Отчет ДЗ №12.
Создал:
Cчет «002» – Активный, Забалансовый, признак Количественный, Активный, Субконто Товары и Контрагенты. Перечисление «ВидыОперацийПоступление», добавил реквизит в док. «Поступление товаров» отработал в МО процедуре «ОбработкаПроведения()».
Перечисление «ВидыОперацийРеализация», добавил реквизит в док. «Реализация товаров», отработал в МО. Добавил процедуры ПродажаСобственногоТовара() и ВозвратПринятогоНаХранениеТовара() вынес в них код с запросом и контролем количества и проведением поводок по сч. «002». Запрос для сч «002» отличается только условиями для вирт. Таблицы (Остатки)
<code>Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ТоварыПринятыеНаОтветственноеХранение) …И Субконто2 = &Контрагент</code>
Развел алгоритм вот так:
<code>Если ОтразитьВБУ Тогда
Если ВидОперации = Перечисления.ВидыОперацийРеализация.Продажа Тогда
ПродажаСобственногоТовара(Отказ);
Иначе
ВозвратПринятогоНаХранениеТовара(Отказ);
КонецЕсли;
. . .
КонецЕсли; </code>
Запросы для контроля остатка по счетам «Товары» и «ТоварыПринятыеНаОтветственноеХранение» не клеил в один, так как, желаю открывать их конструктором и алгоритм лучше читается. Для отражения «Услуги ответственного хранения» по рег. «Продажи» завел предопределенный элем. спр. «Номенклатура», его и использовал в проведении.
Создал спр. «Подразделения», добавил реквизит «Подразделение» в каждый документ, добавил одноименный ВидСубконто и измерение в Регистр Бухгалтерии. Доработал МФ и МО документов.
Создал док. «Авизо», реквизит: ПодразделениеОтправитель, ПодразделениеПолучатель, КорСчет, Субконто1 (тип Характеристика.ВидыСубконто), Субконто2, Сумма, Количество. Поставил ограничения на реквизит КорСчет на уровне Объекта, свойство Параметры выбора (Забалансовый = Ложь, СчетГруппа = Ложь). В форме на реквизит КорСчет определил процедуру:
<code>&НаСервере
Процедура УстановитьВидимостьРеквизитовВЗависимостиОтКорреспонденции()
Для Индекс = 1 По 2 Цикл
Если Индекс <= Объект.КорСчет.ВидыСубконто.Количество() Тогда
Элементы[“Субконто” + Индекс].Видимость = Истина;
Элементы[“Субконто” + Индекс].ОграничениеТипа = Объект.КорСчет.ВидыСубконто[Индекс – 1].ВидСубконто.ТипЗначения;
Иначе
Элементы[“Субконто” + Индекс].Видимость = Ложь;
Элементы[“Субконто” + Индекс].ОграничениеТипа = Новый ОписаниеТипов(“Неопределено”);
КонецЕсли;
КонецЦикла;
Если Объект.КорСчет.Количественный Тогда
Элементы.Количество.Видимость = Истина;
Иначе
Элементы.Количество.Видимость = Ложь;
КонецЕсли;
КонецПроцедуры // УстановитьВидимостьРеквизитовВЗависимостиОтКорреспонденции()</code>
Которую и вызываю из событий ПриСозданииНаСервере() и КорСчетПриИзменении();
ОбработкуПроведения изготовил конструктором и доработал, анализирую КорСчет.Вид и Сумма,
Субконто опеделяю вот так:
<code> Для Индекс = 1 По КорСчет.ВидыСубконто.Количество() Цикл
Движение.СубконтоКт[КорСчет.ВидыСубконто[Индекс – 1].ВидСубконто] = ЭтотОбъект[“Субконто” +Индекс] ;
КонецЦикла; </code>
Отчет «ОСВ по счет» изготовил компоновкой. В параметрах добавил Период (тип Стандартный период), настроил в Варианте предварительный отбор, «Счет» и «Подразделение» имеется на уровне выходных полей, настроил вхождение в быстрый доступ, группировка Счет.
Отчет «Баланс» – компоновкой, источник вот такой Запрос
<code>ВЫБРАТЬ
РегистрУправленческийОстатки.Счет,
ВЫБОР
КОГДА РегистрУправленческийОстатки.СуммаОстатокДт > 0
ТОГДА РегистрУправленческийОстатки.СуммаОстатокДт
ИНАЧЕ РегистрУправленческийОстатки.СуммаОстатокКт
КОНЕЦ КАК Сумма,
ВЫБОР
КОГДА РегистрУправленческийОстатки.СуммаОстатокДт > 0
ТОГДА “Актив”
ИНАЧЕ “Пассив”
КОНЕЦ КАК ВидСредств
ИЗ
РегистрБухгалтерии.РегистрУправленческий.Остатки(, (НЕ Счет.Забалансовый), , ) КАК РегистрУправленческийОстатки</code> Настроил Вариант.
Отчет «Остаки БУ и УУ». Источники 2-а набора, запросы к РегистрУправленческий.Остатки(&КонецПериода, , &ВидСубконто, ) и РегистрНакопления.Запасы.Остатки(&КонецПериода, ). Настроил связь по Товар, параметр КонецПериода что бы учитывал на конец дня и Вид субконто определил значение Товар. Настроил Вариант.
В плане счетов поменяла маску ввода @@@.@@ и создала счет 002 забалансовый, количественный субконто товары и контрагенты. Для документов создала реквизит ВидОперации – тип перечисление ВидОперации(покупка, принятие на хранение,реализация, возврат). В поступлении проводки делаются на основании конструкции если. Учитывается вид операции и значение УУ и БУ. В документе реализация товаров также используются конструкции если и добавила новую процедуру ДвиженияПоОстаткамХраненияБух(Отказ) в которой делается проверка остатков и расчет суммы с проводками по виду операции Возврат. Создала справочник Подразделения организации, иерархический с видом подчинения элементам. В регистр бухгалтерии добавила измерение подразделения – тип справочник подразделения организации. Доработала проводки документов для заполнения нового измерения по регистру бухгалтерии. Создала счет 79 активно-пассивный с субконто подразделения. Документ Авизо с реквизитами организация получатель и организация отправитель и ТЧ Проводки. Проведение запретила. В модуле перед записью если ВидСч=ВидСчета.Активный ИЛИ (ВидСч=ВидСчета.АктивноПассивный И Элемент.Сумма>0) вызывается процедура с передачей параметров для записи в регистр бухгалтерии. Отчеты создавала на основании видео уроков.
1. Новое про сторно
2. Здесь же были и трудности. Неоднократный пересмотр и реализация на базе помогает усвоить данный материал.
3. Не хватает тем о налоговом учете.
Что касается налогового учета, то эти темы и не планировались. Ведь это не курсы по прикладным решениям.
Технически налоговый учет организован теми же средствами платформы, что и бухгалтерский.
Задание выполнил.
Модифицировал существующие процедуры записи и контроля остатков регистра бухгалтерии для использования два субконто и подразделения.
При создании Авизо долго разбирался как сделать связь полей Субконто с полем Счет. Сделал “связь по типу” с реквизитом Счет у реквизитов Субконто1 и Субконто2 с установкой “Элемент связи по типу” в значение 1 и 2. Установил также у Субконто “связь параметров выбора” и у полей Субконто в форме отключил “ВыбиратьТип”.
С отчетами трудностей не возникло.
по третьему блоку
1. Получение остатков на конец периода для разных таблиц.
2. Материал доходчив для понимания
Задание выполнил, проблем не возникло.
По 3-му блоку:
1. Нового: плану счетов можно настроить подчинение.
2. затруднений небыло
3. В каком случае может пригодится подчинение плану сетов при прешении практических задач?
3. На практике не встречал такого подчинения.
Реализовано оно в виде общего подхода.
Тем не менее, можно придумать задачу. Например, у каждого счета может быть список ответственных бухгалтеров (собственных сотрудников), при это для каждой проводки (отдельно для Дт и Кт) будет указан один ответственный из этого списка.
Всем доброго времени суток.
Представляю отчёт по двенадцатому домашнему заданию. </code>
В плане счетов установил максимальное количество субконто = 2. Добавил предопределённый элемент (с учётом маски кода) 00.2, кода создавал – маску отключал, представление выглядит нормально – без точки, сам счёт во всех документах/отчётах выводится с точкой. Есть способ это побороть не отключая маску или пусть так и остаётся?
У счёта 002 установил вид – Забалансовый, признак учёта – Количественный, виды субконто Номенклатура и Контрагент.
Создал перечисление ВидОперации с четырмя значениями: Покупка, Продажа, ПриемНаОтветственноеХранение и ВозвратСОтветственногоХранения. В документы ПоступлениеТоваров и РеализацияТоваров добавил реквизит ВидОперации с типом данных – одноимённое перечисление. На форме документа разместил в виде радиокнопки. В модуле объекта добавил условие на проверку значения реквизита ВидОперации, в соответствии со значением вызывается соответсвующая процедура, формирующая проводки по УУ и балансовому БУ или забалансовому БУ.
В документе РеализацияТоваров кроме проводки по регистру бухгалтерии формируется единая проводка по регистру накопления УчетПродаж. Для этого в справочник Номенклатура добавил предопределённый элемент ОтветственноеХранение. Привожу частичный листинг модуля объекта документа РеализацияТоваров:
<code>
Процедура ПроведениеПоЗабалансовомуУчету(Отказ, Режим)
Движения.Управленческий.Очистить();
Движения.Управленческий.Записать();
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| Товары.Номенклатура,
| Товары.Количество КАК КолДок,
| Товары.Сумма КАК СумДок,
| Товары.НомерСтроки,
| ЕСТЬNULL(УправленческийОстатки.СуммаОстатокДт, 0) КАК СумОст,
| ЕСТЬNULL(УправленческийОстатки.КоличествоОстатокДт, 0) КАК КолОст
|ИЗ
| (ВЫБРАТЬ
| РеализацияТоваровТовары.Номенклатура КАК Номенклатура,
| СУММА(РеализацияТоваровТовары.Количество * РеализацияТоваровТовары.К) КАК Количество,
| СУММА(РеализацияТоваровТовары.Сумма) КАК Сумма,
| МАКСИМУМ(РеализацияТоваровТовары.НомерСтроки) КАК НомерСтроки
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары
| ГДЕ
| РеализацияТоваровТовары.Ссылка = &Ссылка
|
| СГРУППИРОВАТЬ ПО
| РеализацияТоваровТовары.Номенклатура) КАК Товары
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрБухгалтерии.Управленческий.Остатки(
| &Момент,
| Счет = ЗНАЧЕНИЕ(ПланСчетов.Управленческий.ТМЦПринятыеНаХранение),
| ,
| (Субконто1, Субконто2) В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| РеализацияТоваровТовары.Номенклатура,
| РеализацияТоваров.Контрагент
| ИЗ
| Документ.РеализацияТоваров.Товары КАК РеализацияТоваровТовары ЛЕВОЕ СОЕДИНЕНИЕ Документ.РеализацияТоваров КАК РеализацияТоваров
| ПО
| РеализацияТоваровТовары.Ссылка = РеализацияТоваров.Ссылка
| ГДЕ
| РеализацияТоваров.Ссылка = &Ссылка
| И РеализацияТоваровТовары.Ссылка = &Ссылка)
| И Организация = &Организация) КАК УправленческийОстатки
| ПО (УправленческийОстатки.Субконто1 = Товары.Номенклатура)”;
Запрос.УстановитьПараметр(“Момент”, Новый Граница(МоментВремени(), ВидГраницы.Включая));
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Запрос.УстановитьПараметр(“Организация”, Организация);
Результат = Запрос.Выполнить();
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
// Проверка отатков
Нехватка = Выборка.КолДок – Выборка.КолОст;
Если Нехватка > 0 Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Товара ” + Выборка.Номенклатура + ” не хватает в количестве ” + Нехватка;
Сообщение.Поле = “Товары[” + (Выборка.НомерСтроки – 1) + “].Количество”;
Сообщение.УстановитьДанные(ЭтотОбъект);
Сообщение.Сообщить();
Отказ = Истина;
Продолжить;
КонецЕсли;
//Движения по регистру бухгалтерии Управленческий
// Проводка списания Товаров
Проводка = Движения.Управленческий.Добавить();
Проводка.Период = Дата;
Проводка.Организация = Организация;
Проводка.СчетКт = ПланыСчетов.Управленческий.ТМЦПринятыеНаХранение;
Проводка.СубконтоКт.Номенклатура = Выборка.Номенклатура;
Проводка.СубконтоКт.Контрагент = Контрагент;
Проводка.КоличествоКт = Выборка.КолДок;
Если Выборка.КолОст = Выборка.КолДок Тогда
Проводка.Сумма = Выборка.СумОст;
ИначеЕсли Выборка.КолОст = 0 Тогда
Проводка.Сумма = 0;
Иначе
Проводка.Сумма = Выборка.СумОст * Выборка.КолДок / Выборка.КолОст;
КонецЕсли;
КонецЦикла;
// Проводка взаиморасчетов
Проводка = Движения.Управленческий.Добавить();
Проводка.Период = Дата;
Проводка.Организация = Организация;
Проводка.СчетДт = ПланыСчетов.Управленческий.Покупатели;
Проводка.СубконтоДт.Контрагент = Контрагент;
Проводка.СчетКт = ПланыСчетов.Управленческий.Выручка;
Проводка.Сумма = СуммаДокумента;
// Движение по регистру УчетПродаж
Движение = Движения.УчетПродаж.Добавить();
Движение.Период = Дата;
Движение.Организация = Организация;
Движение.Контрагент = Контрагент;
Движение.Номенклатура = Справочники.Номенклатура.ОтветственноеХранение;
Движение.Количество = 1;
Движение.Сумма = СуммаДокумента;
КонецПроцедуры
</code>
Как видно из кода – запрос для контроля остатков выполняется с учётом остатков по подразделению.
С разнесением учёта на разные подразделения проблем не возникло. Создал справочник Подразделения. Во все документы добавил реквизит организация – обязательный для заполнения. В регистр бухгалтерии и все регистры накопления добавил измерение Организация, из регистров сведений такое измерение добавил только в МенеджеровКонтрагентов, т.к. ЦеныНаНоменклатуру и СоставНаборов целесообразнее вести едино для всех подразделений (если только конечно они не в сильно разных регионах, тогда может быть цены и надо будет разделить). Доработал процедуры проведения всех документов с учётом новых измерений регистров.
Создал документ Авизо. Реквизиты Отправитель и Получатель с типом данных СправочникСсылка.Подразделения, табличная часть с указанными полями. У полей Субконто1 и Субконто2 установил Связь по типу: Элементы.Передача.Текущие данные.Счет (элементы связи разнёс как 1 и 2), в принципе, при наличии у выбранного счёта субконто – в указанных полях открываются соответсвующие справочники (на примере счёта 002 работало), вот только при отсутствии второго субконто – вылазит окно с предложением выбрать тип данных. Способа побороть пока не нашёл. Если для обычного реквизита я могу добраться и програмно устаовить некоторые из свойств, то с полями отдельной строки табличной части такой номер не проходит, да и думается, что для одного и того же поля но в разных строках документа система не даст устанавливать различные свойства.
Привожу частичный листинг модуля объекта документа Авизо:
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Набор = Движения.Управленческий;
Для каждого Строчка Из Передача Цикл
Если Строчка.Счет.Вид = ВидСчета.Активный ИЛИ
(Строчка.Счет.Вид = ВидСчета.АктивноПассивный И Строчка.Сумма > 0) Тогда
ПроводкаЧастьПервая(Отправитель, Получатель, Строчка, Набор);
ПроводкаЧастьВторая(Получатель, Отправитель, Строчка, Набор);
Иначе
ПроводкаЧастьВторая(Отправитель, Получатель, Строчка, Набор);
ПроводкаЧастьПервая(Получатель, Отправитель, Строчка, Набор);
КонецЕсли;
КонецЦикла;
Если НЕ Отказ Тогда
Движения.Управленческий.Записать();
КонецЕсли;
КонецПроцедуры
Процедура ПроводкаЧастьПервая(Организация, Подразделение, Строчка, Набор)
// Проводка по отправителю
Проводка = Набор.Добавить();
Проводка.Период = Дата;
Проводка.Организация = Организация;
Проводка.СчетДт = ПланыСчетов.Управленческий.ОбособленныеПодразделения;
Проводка.СубконтоДт.Подразделение = Подразделение;
Проводка.СчетКт = Строчка.Счет;
Если Строчка.Субконто2 <> Неопределено Тогда
ИмяСубконто = “ПланыВидовХарактеристик.ВидыСубконто.” + Строчка.Субконто2.Метаданные().Имя;
Проводка.СубконтоКт[ИмяСубконто] = Строчка.Субконто2;
ИначеЕсли Строчка.Субконто1 <> Неопределено Тогда
ИмяСубконто = “ПланыВидовХарактеристик.ВидыСубконто.” + Строчка.Субконто1.Метаданные().Имя;
Проводка.СубконтоКт[ИмяСубконто] = Строчка.Субконто1;
КонецЕсли;
Если Строчка.Количество <> 0 Тогда
Проводка.КоличествоКт = Строчка.Количество;
КонецЕсли;
Проводка.Сумма = Строчка.Сумма;
КонецПроцедуры
</code>
Процедура ПроводкаЧастьВторая аналогична первой, только соответственно счета Дт и Кт поменяны местами.
Как отчитываться по отчётам – до сих пор себе не представляю, приведу тексты запросов из схем Компоновки Данных:
– Оборотно-сальдовая ведомость
<code>
ВЫБРАТЬ
УправленческийОстаткиИОбороты.Счет,
УправленческийОстаткиИОбороты.Субконто1,
УправленческийОстаткиИОбороты.Субконто2,
УправленческийОстаткиИОбороты.СуммаНачальныйОстатокДт,
УправленческийОстаткиИОбороты.СуммаНачальныйОстатокКт,
УправленческийОстаткиИОбороты.СуммаКонечныйОстатокДт,
УправленческийОстаткиИОбороты.СуммаКонечныйОстатокКт,
УправленческийОстаткиИОбороты.СуммаОборотДт,
УправленческийОстаткиИОбороты.СуммаОборотКт
ИЗ
РегистрБухгалтерии.Управленческий.ОстаткиИОбороты(, , , , {(Счет) КАК СчетФильтр}, , {(Организация) КАК Подразделение}) КАК УправленческийОстаткиИОбороты
</code>
– Баланс
<code>
ВЫБРАТЬ
УправленческийОстатки.Счет,
ВЫБОР
КОГДА УправленческийОстатки.СуммаОстатокДт > 0
ТОГДА “Актив”
ИНАЧЕ “Пассив”
КОНЕЦ КАК Раздел,
ВЫБОР
КОГДА УправленческийОстатки.СуммаОстатокДт > 0
ТОГДА УправленческийОстатки.СуммаОстатокДт
ИНАЧЕ УправленческийОстатки.СуммаОстатокКт
КОНЕЦ КАК Сумма
ИЗ
РегистрБухгалтерии.Управленческий.Остатки(
,
(НЕ Счет.Забалансовый),
,
Организация = &Организация
ИЛИ &Организация = ЗНАЧЕНИЕ(Справочник.Подразделения.ПустаяСсылка)) КАК УправленческийОстатки
</code>
– Остатки по БУ и УУ
<code>
ВЫБРАТЬ
ОстаткиНоменклатурыОстатки.Номенклатура,
СУММА(ОстаткиНоменклатурыОстатки.КоличествоОстаток) КАК ОстатокУУ,
СУММА(УправленческийОстатки.КоличествоОстаток) КАК ОстатокБУ
ИЗ
РегистрБухгалтерии.Управленческий.Остатки(, Счет.ВидыСубконто.ВидСубконто = ЗНАЧЕНИЕ(ПланВидовХарактеристик.ВидыСубконто.Номенклатура), , ) КАК УправленческийОстатки
ПОЛНОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиНоменклатуры.Остатки(, ) КАК ОстаткиНоменклатурыОстатки
ПО УправленческийОстатки.Субконто1 = ОстаткиНоменклатурыОстатки.Номенклатура
СГРУППИРОВАТЬ ПО
ОстаткиНоменклатурыОстатки.Номенклатура
</code>
В итоге группировок и настроек отчёты получились анологичны приведённым в задании, за небольшим исключением – в балансе я нижнюю итоговую строку всё же убрал, как не имеющую смысла.
По отчётам, правда, возникли вопросы:
1) в ОСВ, если счёт-фильтр пустой И стоит условие на равенство – отчёт не формируется (пустой), если условие поменять на “В группе”, то при пустом значении – формируется нормально. Почему?
2) в балансе и отчёте по остаткам (период в СКД приведён к концу дня + 1 секунда), если дата не указана – отчёт формируется за самый первый день? Считать такое поведение нормальным или стоит исправлять программно?
1. Это правильное поведение. Для условия “В группе” при незаданной группе будут выбираться все счета.
2. Это неправильное поведение отчета.
Отчет формируется на момент начала нашего века по следующей причине – вы к пустой дате прибавляете одну секунду. Получается, что отчет будет формироваться на 1 секунду 1 дня 1 года.
Чтобы обойти ситуацию нужно использовать конструкцию Выбор. Если я не ошибаюсь, это реализовано в решении задания. Если подобной проверки не найдете – обращайтесь в МГ, разберем.
Задание выполнил.
Списание по сч. 002 подобно списанию по 41.
В документе Авизо много времени потратил на приведение полей Субконто1 и Субконто2 к необходимым типам.
Модуль формы док-та Авизо:
<code>
&НаКлиенте
Процедура ОсновнаяСчетПриИзменении(Элемент)
ТД=Элементы.Основная.ТекущиеДанные;
Если ЗначениеЗаполнено(ТД.Счет) Тогда
ПрЗабалансовый=Неопределено;
ПрГруппы=Неопределено;
ВидыСубконтоСчета=ПолучитьВидыСубконтоСчета(ТД.Счет,ПрЗабалансовый,ПрГруппы);
Если ПрЗабалансовый или ПрГруппы Тогда
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = “Нельзя выбрать забалансовый или групповой счет!”;
Сообщение.Поле = “Объект.Основная[“+Элементы.Основная.ТекущаяСтрока+”].Счет”;
Сообщение.УстановитьДанные(Объект);
Сообщение.Сообщить();
ТД.Счет=Неопределено;
Возврат;
КонецЕсли;
i=1;
Для каждого Эл Из ВидыСубконтоСчета Цикл
ТД[“Субконто”+i] = Эл.ПривестиЗначение(ТД[“Субконто”+i]);
i=i+1;
КонецЦикла;
Если ВидыСубконтоСчета.Количество()<2 Тогда
Для i=ВидыСубконтоСчета.Количество()+1 По 2 Цикл
ТД[“Субконто”+i] = Неопределено;
КонецЦикла;
КонецЕсли;
КонецЕсли;
КонецПроцедуры
&НаСервере
Функция ПолучитьВидыСубконтоСчета(Счет,ПрЗабалансовый,ПрГруппы)
Массив=Новый Массив;
Для каждого ВС Из Счет.ВидыСубконто Цикл
Массив.Добавить(ВС.ВидСубконто.ТипЗначения);
КонецЦикла;
ПрЗабалансовый=Счет.Забалансовый;
ПрГруппы=Счет.ГрупповойСчет;
Возврат Массив;
КонецФункции // ПолучитьВидыСубконтоСчета()
&НаКлиенте
Процедура ОсновнаяСубконто1НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка=ОбработкаСубконто(1);
КонецПроцедуры
&НаКлиенте
Процедура ОсновнаяСубконто2НачалоВыбора(Элемент, ДанныеВыбора, СтандартнаяОбработка)
СтандартнаяОбработка=ОбработкаСубконто(2);
КонецПроцедуры
&НаКлиенте
Функция ОбработкаСубконто(НомерСубконто)
ТД=Элементы.Основная.ТекущиеДанные;
Если ЗначениеЗаполнено(ТД.Счет) Тогда
ПрЗабалансовый=Неопределено;
ПрГруппы=Неопределено;
ВидыСубконтоСчета=ПолучитьВидыСубконтоСчета(ТД.Счет,ПрЗабалансовый,ПрГруппы);
Если ВидыСубконтоСчета.Количество()>=НомерСубконто Тогда
ВыбЗнач = ВидыСубконтоСчета[НомерСубконто-1].ПривестиЗначение(ТД[“Субконто”+НомерСубконто]);
Если ВвестиЗначение(ВыбЗнач) Тогда
ТД[“Субконто”+НомерСубконто]=ВыбЗнач;
Иначе
ТД[“Субконто”+НомерСубконто]=Неопределено;
КонецЕсли;
Возврат Ложь;
Иначе
ТД[“Субконто”+НомерСубконто] = Неопределено;
Возврат Ложь;
КонецЕсли;
Иначе
Возврат Ложь;
КонецЕсли;
КонецФункции // ОбработкаСубконто()
</code>
Модуль объекта Авизо:
<code>
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
Запрос = Новый Запрос;
Запрос.Текст =
“ВЫБРАТЬ
| АвизоОсновная.Субконто1,
| АвизоОсновная.Субконто2,
| АвизоОсновная.Количество,
| Управленческий.Количественный,
| Управленческий.Вид,
| АвизоОсновная.Сумма,
| АвизоОсновная.Счет
|ИЗ
| Документ.Авизо.Основная КАК АвизоОсновная
| ЛЕВОЕ СОЕДИНЕНИЕ ПланСчетов.Управленческий КАК Управленческий
| ПО АвизоОсновная.Счет = Управленческий.Ссылка
|ГДЕ
| АвизоОсновная.Ссылка = &Ссылка
| И (НЕ Управленческий.ГрупповойСчет)
| И (НЕ Управленческий.Забалансовый)”;
Запрос.УстановитьПараметр(“Ссылка”, Ссылка);
Результат = Запрос.Выполнить();
Счет_79=ПланыСчетов.Управленческий.ОбособленныеПодразделения;
ДЗ = Результат.Выбрать();
Пока ДЗ.Следующий() Цикл
Если (ДЗ.Вид=ВидСчета.Активный) или ((ДЗ.Вид=ВидСчета.АктивноПассивный) и (ДЗ.Сумма>0)) Тогда
//Первая проводка (актив)
Проводка = Движения.УправленческийРБ.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = Счет_79;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения] = ПодразделениеПолучатель;
Проводка.Подразделение = Подразделение;
Проводка.СчетКт = ДЗ.Счет;
Массив=Новый Массив;
i=1;
Для каждого ВС Из ДЗ.Счет.ВидыСубконто Цикл
Если i=1 Тогда
Если ЗначениеЗаполнено(ДЗ.Субконто1) Тогда
Проводка.СубконтоКт[ВС.ВидСубконто] = ДЗ.Субконто1;
КонецЕсли;
ИначеЕсли i=2 Тогда
Если ЗначениеЗаполнено(ДЗ.Субконто2) Тогда
Проводка.СубконтоКт[ВС.ВидСубконто] = ДЗ.Субконто2;
КонецЕсли;
КонецЕсли;
i=i+1;
КонецЦикла;
Если ДЗ.Количественный Тогда
Проводка.КоличествоКт = ДЗ.Количество;
КонецЕсли;
Проводка.Сумма = ДЗ.Сумма;
//Вторая проводка (актив)
Проводка = Движения.УправленческийРБ.Добавить();
Проводка.Период = Дата;
Проводка.СчетКт = Счет_79;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения] = Подразделение;
Проводка.Подразделение = ПодразделениеПолучатель;
Проводка.СчетДт = ДЗ.Счет;
Массив=Новый Массив;
i=1;
Для каждого ВС Из ДЗ.Счет.ВидыСубконто Цикл
Если i=1 Тогда
Если ЗначениеЗаполнено(ДЗ.Субконто1) Тогда
Проводка.СубконтоДт[ВС.ВидСубконто] = ДЗ.Субконто1;
КонецЕсли;
ИначеЕсли i=2 Тогда
Если ЗначениеЗаполнено(ДЗ.Субконто2) Тогда
Проводка.СубконтоДт[ВС.ВидСубконто] = ДЗ.Субконто2;
КонецЕсли;
КонецЕсли;
i=i+1;
КонецЦикла;
Если ДЗ.Количественный Тогда
Проводка.КоличествоДт = ДЗ.Количество;
КонецЕсли;
Проводка.Сумма = ДЗ.Сумма;
ИначеЕсли (ДЗ.Вид=ВидСчета.Пассивный) или ((ДЗ.Вид=ВидСчета.АктивноПассивный) и (ДЗ.Сумма<0)) Тогда
СуммаПроводки=?(ДЗ.Вид=ВидСчета.Пассивный,ДЗ.Сумма,-ДЗ.Сумма);
//Первая проводка (пассив)
Проводка = Движения.УправленческийРБ.Добавить();
Проводка.Период = Дата;
Проводка.СчетКт = Счет_79;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения] = ПодразделениеПолучатель;
Проводка.Подразделение = Подразделение;
Проводка.СчетДт = ДЗ.Счет;
Массив=Новый Массив;
i=1;
Для каждого ВС Из ДЗ.Счет.ВидыСубконто Цикл
Если i=1 Тогда
Если ЗначениеЗаполнено(ДЗ.Субконто1) Тогда
Проводка.СубконтоДт[ВС.ВидСубконто] = ДЗ.Субконто1;
КонецЕсли;
ИначеЕсли i=2 Тогда
Если ЗначениеЗаполнено(ДЗ.Субконто2) Тогда
Проводка.СубконтоДт[ВС.ВидСубконто] = ДЗ.Субконто2;
КонецЕсли;
КонецЕсли;
i=i+1;
КонецЦикла;
Если ДЗ.Количественный Тогда
Проводка.КоличествоДт = ДЗ.Количество;
КонецЕсли;
Проводка.Сумма = СуммаПроводки;
//Вторая проводка (пассив)
Проводка = Движения.УправленческийРБ.Добавить();
Проводка.Период = Дата;
Проводка.СчетДт = Счет_79;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения] = Подразделение;
Проводка.Подразделение = ПодразделениеПолучатель;
Проводка.СчетКт = ДЗ.Счет;
Массив=Новый Массив;
i=1;
Для каждого ВС Из ДЗ.Счет.ВидыСубконто Цикл
Если i=1 Тогда
Если ЗначениеЗаполнено(ДЗ.Субконто1) Тогда
Проводка.СубконтоКт[ВС.ВидСубконто] = ДЗ.Субконто1;
КонецЕсли;
ИначеЕсли i=2 Тогда
Если ЗначениеЗаполнено(ДЗ.Субконто2) Тогда
Проводка.СубконтоКт[ВС.ВидСубконто] = ДЗ.Субконто2;
КонецЕсли;
КонецЕсли;
i=i+1;
КонецЦикла;
Если ДЗ.Количественный Тогда
Проводка.КоличествоКт = ДЗ.Количество;
КонецЕсли;
Проводка.Сумма = СуммаПроводки;
КонецЕсли;
КонецЦикла;
Движения.УправленческийРБ.Записывать=Истина;
КонецПроцедуры
</code>
Отчеты на СКД создал без особых проблем. Наткнулся на то, что оператор ВЫБОР в недокументированной форме приводил к ошибке при формировании отчета. Привел к стандарту – заработало.
Наибольшие затруднения возникают с отработкой различных действий на форме.
Выполнено.
В документах Поступление и Реализации введен реквизит ВидОперации типа Перечисления.ВидыОпераций.
План счетов – изменен шаблон кода на “@@@.@@”.
В документе реализации с ВидомОперации = “ВыдачаСОтветХранения” формируются движения по регистру “Продажа” (услуги за хранение).
Для этого в справочнике “Номенклатура” ПРЕДОПРЕДЕЛИЛ элемент “Услуги за хранение”.
В план счетов ввел балансовое измерение Подразделение типа Справочники.Подразделения.
Документ Авизо.
Добавил реквизиты ПодразделениеОтправитель и ПодразделениеПолучатель и табличную часть Счета.
В табличной части реквизиты: Счет, ВидСубконто1, Субконто1, ВидСубконто2, Субконто2, Сумма, Количество.
Реквизиты ВидСубконто1,2 недоступны для изменения и определяются при выборе Счета.
Реквизиты Субконто1,2 имеют тип данных “Характеристика.ВидыСубконто” И СВЯЗАНЫ ПО ТИПУ с ВидомСубконто1,2 соответственно.
В моделе формы Документа получаю параметры счета (в т.ч. доступные виды субконто) через функцию
&НаСервереБезКонтекста
Функция ВернутьПараметрыСчетаНаСервере(Счет)
Если Счет.ЗапретитьИспользоватьВПроводках ИЛИ Счет.Забалансовый Тогда
Возврат Неопределено;
КонецЕсли;
ПарамСчета = Новый Структура();
ПарамСчета.Вставить(“Вид”, Счет.Вид);
ПарамСчета.Вставить(“Количественный”, Счет.Количественный);
ПарамСчета.Вставить(“Забалансовый”, Счет.Забалансовый);
ТЗ = Счет.ВидыСубконто.Выгрузить();
Если ТЗ.Количество() > 0 Тогда
Строка = ТЗ.Получить(0);
ПарамСчета.Вставить(“ВидСубконто1”, Строка.ВидСубконто);
Если ТЗ.Количество() > 1 Тогда
Строка = ТЗ.Получить(1);
ПарамСчета.Вставить(“ВидСубконто2”, Строка.ВидСубконто);
КонецЕсли;
КонецЕсли;
Возврат ПарамСчета;
КонецФункции
Обеспечиваю выбор/запрет значений Субконто1,2 в зависимости от ВидовСубконто1,2
При проведении документа “ядром” действий является процедура
Процедура ДобавитьПроводку(ДанныеСтроки, Отправитель, Получатель, Сумма, ПризнакАктив = Истина)
СчетУчета = ДанныеСтроки.Счет;
Проводка = Движения.БухУчет.Добавить();
Проводка.Период = Дата;
Проводка.Подразделение = Отправитель;
Если ПризнакАктив Тогда
//Отправитель : Дт 79 – Кт СчУчета
Проводка.СчетДт = Планысчетов.Основной.ОбособленныеПодразделения;
Проводка.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения] = Получатель;
Проводка.СчетКт = СчетУчета;
Если ЗначениеЗаполнено(ДанныеСтроки.ВидСубконто1) Тогда
Проводка.СубконтоКт[ДанныеСтроки.ВидСубконто1] = ДанныеСтроки.Субконто1;
КонецЕсли;
Если ЗначениеЗаполнено(ДанныеСтроки.ВидСубконто2) Тогда
Проводка.СубконтоКт[ДанныеСтроки.ВидСубконто2] = ДанныеСтроки.Субконто2;
КонецЕсли;
Если СчетУчета.Количественный Тогда
Проводка.КоличествоКт = ДанныеСтроки.Количество; //количество – НЕ балансовый ресурс
КонецЕсли;
Проводка.Сумма = Сумма;
Иначе //пассив
//Отправитель : Дт СчУчета – Кт 79
Проводка.СчетКт = Планысчетов.Основной.ОбособленныеПодразделения;
Проводка.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Подразделения] = Получатель;
Проводка.СчетДт = СчетУчета;
Если ЗначениеЗаполнено(ДанныеСтроки.ВидСубконто1) Тогда
Проводка.СубконтоДт[ДанныеСтроки.ВидСубконто1] = ДанныеСтроки.Субконто1;
КонецЕсли;
Если ЗначениеЗаполнено(ДанныеСтроки.ВидСубконто2) Тогда
Проводка.СубконтоДт[ДанныеСтроки.ВидСубконто2] = ДанныеСтроки.Субконто2;
КонецЕсли;
Если СчетУчета.Количественный Тогда
Проводка.КоличествоДт = ДанныеСтроки.Количество; //количество – НЕ балансовый ресурс
КонецЕсли;
Проводка.Сумма = Сумма;
КонецЕсли;
КонецПроцедуры
Проблем с отчетами не было …. были лишь многочисленные экспиременты с СКД…
РЕЗЮМЕ по 3 блоку
В 3 блоке хотелось бы выделить главу Разработка отчетов, особенно систему компоновки данных.
Думаю, в Продвинутом курсе эта тема будет расширена…
Ну и конечно новым для меня была работа с регистом бухгалтерии.
Интересным (в плане опыта) показалась тема Сторнирования.
Сложности были. Что помогало – повторный просмотр видео-уроков.
Дом.задания – просто НЕОБХОДИМЫЙ элемент изучения материала.
Задание выполнила. http://fotoifolder.ru/view_full_size/olmkbam7bmt8
http://fotoifolder.ru/view_full_size/gnl0uj5t662z
Но аналитика в “Авизо” не получается
http://fotoifolder.ru/view_full_size/segg-seau3w5
http://fotoifolder.ru/view_full_size/e3c6moztazix
Выполнено. Контроль остатков при списании со счета 002 по старому алгоритму.
Значение реквизита Баланс (= Подразделения организации) заполняется в модуле набора записей. Так как в этом модуле есть код, где набор записей выгружается в ТЗ для свертки ТЗ.Свернуть(СтрКолонок,”Сумма”); , то использую
ТЗ.ЗаполнитьЗначения(Ссылка.Баланс,”Баланс”); , Загрузить(ТЗ); для всех документов, кроме Операция и Авизо.
Отчеты без затруднений. В авизо Субконто1 и Субконто 2 приводятся к типу видов субконто выбранного счета, если счет не выбран, то пользователь не сможет назначить субконто , т к кнопка выбора отсутствует (снята галка выбирать тип). Соответствие Количество – счет количественный проверяется при изменении элемента формы Количество.
Что нового – очень полезный материал про сторнирование.
Наибольшие затруднения вызвало приведение субконто на форме к виду выбранного счета в документе Авизо.
Хотелось бы уточнить по ДЗ №12.
1. Если продолжать идеологию ДЗ №11, то на ответственное хранение принимаем ТОВАРЫ и НАБОРЫ (без комплектующих)?
2. При выдаче с ответ.хранения КАКИЕ данные об услугах заносим в регистр продажи: на сумму документа (т.е. предопределить некую услугу хранения для Номенклатуры) или в табличной части вместе с выдаваемыми товарами могут оказаться услуги, которые и следуют учесть?
Спасибо.
1. Да, верно.
2. Используйте сумму документа.