|
Почему в лекции 1 "Основы организации бухгалтерской подсистемы" курса "Разработка прикладных решений для платформы 1С:Предприятие 8.2 в режиме "Управляемое приложение"" совершенно нет информации о том что нужно на вкладке данные в табличной части создать табличную часть "ВидыСубконто" и также нет информации о том какие нужно добавить реквизиты и какие у этих реквизитов должен быть тип? Считаю лекцию 1 в данном вопросе недоработанной. |
Бухгалтерская подсистема: расходные документы и переоценка валютных остатков
Проведение документа РеализацияМатериалов
Добавим в документ РеализацияМатериалов новый реквизит – Валюта, тип – СправочникСсылка.Валюты. Мы будем заполнять этот реквизит в том случае, если документ отражает реализацию материалов с взаиморасчетами в валюте. Разместим реквизит на форме документа. Добавим документ в состав подсистемы БухгалтерскийУчет. Включим проведение документа по регистру бухгалтерии Хозрасчетный. Добавим в форму документа команду перехода к регистру бухгалтерии Хозрасчетный ( рис. 3.4).
Документ РеализацияМатериалов уже используется в системе для решения задач оперативного учета материалов, мы оставим процедуру проведения по регистру накопления в исходном состоянии, выполнив лишь небольшие доработки, связанные с возможностью заполнения документа в валюте. Для реализации процедуры проведения документа по бухгалтерскому учету добавим в модуль документа еще одну процедуру следующего вида:
Процедура ОбработкаПроведенияПоБухучету(Отказ) КонецПроцедуры
Передача в процедуру параметра Отказ позволит, при проверке данных по бухгалтерскому учету, отказаться от проведения в том случае, если оно будет невозможным.
Для проведения документа нам понадобятся следующие данные:
- Информация из табличной части документа с данными о номенклатуре, количестве и выручке
- Информация из таблицы остатков регистра бухгалтерии, содержащая сведения об общем остатке данной номенклатурной позиции, об общей себестоимости и об остатке за конкретным ответственным лицом, с которого мы будем списывать материалы. Данные об общих остатках позволят нам найти среднюю себестоимость материалов, а данные об остатках, числящихся за ответственным лицом, позволят понять, сможем ли мы списать с ответственного лица запрошенное количество материалов.
При отладке запроса, который будет использоваться для получения указанных данных, так же полезно пользоваться консолью запросов.
В итоге мы пришли к такому коду – здесь представлен полный код модуля документа Реализация материалов – введение валютного учета потребовало модификации кода, проводящего документ по регистрам накопления, который уже присутствует в модуле.
Процедура ОбработкаПроведения(Отказ, РежимПроведения)
//Будем хранить здесь найденный курс валюты или 1, если валюта не задана
//Если документ отражает реализацию в валюте, мы должны будем учесть это
//при проведении его не только по бухгалтерскому учету, но и по
//регистрам накопления
Перем КурсВалюты;
Если Валюта = Справочники.Валюты.ПустаяСсылка() Тогда
КурсВалюты=1;
Иначе
КурсВалюты=ПолучитьКурсВалюты(Отказ);
КонецЕсли;
//Вызываем процедуру проведения по бухгалтерскому учету
ОбработкаПроведенияПоБухучету(Отказ, КурсВалюты);
//Приступаем к проведению документа по регистрам накопления
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокМ.Номенклатура,
| СУММА(ДокМ.Количество) КАК Количество,
| СУММА(ДокМ.Выручка) КАК Выручка,
| МАКСИМУМ(ЕСТЬNULL(ОстМ.КоличествоОстаток, 0)) КАК КоличествоОстатков,
| МАКСИМУМ(ЕСТЬNULL(ОстМ.СуммаОстаток, 0)) КАК СуммаОстатков
|ИЗ
| Документ.РеализацияМатериалов.Материалы КАК ДокМ
| ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ОстаткиМатериалов.Остатки
(&МоментВремени, ОтветственныйСотрудник = &ОтвСотр) КАК ОстМ
| ПО ДокМ.Номенклатура = ОстМ.Номенклатура
|ГДЕ
| ДокМ.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ДокМ.Номенклатура";
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("ОтвСотр", ОтветственныйСотрудник);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
Результат = Запрос.Выполнить();
ВыборкаДЗ = Результат.Выбрать();
Движения.ОстаткиМатериалов.Записывать=Истина;
Движения.Продажи.Записывать=Истина;
Пока ВыборкаДЗ.Следующий() Цикл
Если ВыборкаДЗ.Количество>ВыборкаДЗ.КоличествоОстатков Тогда
Сообщить("Недостаточное количество товара "
+ВыборкаДЗ.Номенклатура
+", необходимо "+ВыборкаДЗ.Количество+", в наличии "
+ВыборкаДЗ.КоличествоОстатков);
Отказ=Истина;
Движения.ОстаткиМатериалов.Записывать=Ложь;
Движения.Продажи.Записывать=Ложь;
КонецЕсли;
Если Отказ Тогда
Продолжить;
КонецЕсли;
//Движения по регистру ОстаткиМатериалов не зависят от валюты документа
Движение=Движения.ОстаткиМатериалов.Добавить();
Движение.ВидДвижения=ВидДвиженияНакопления.Расход;
Движение.Период=Дата;
Движение.Номенклатура=ВыборкаДЗ.Номенклатура;
Движение.Количество=ВыборкаДЗ.Количество;
Движение.Сумма=ВыборкаДЗ.Количество*ВыборкаДЗ.СуммаОстатков
/ВыборкаДЗ.КоличествоОстатков;
Движение.ОтветственныйСотрудник=ОтветственныйСотрудник;
//Движения по регистру Продажи должны выполняться с учетом курса валюты
Движение=Движения.Продажи.Добавить();
Движение.Период=Дата;
Движение.Номенклатура=ВыборкаДЗ.Номенклатура;
Движение.Количество=ВыборкаДЗ.Количество;
Движение.Себестоимость=ВыборкаДЗ.Количество*ВыборкаДЗ.СуммаОстатков
/ВыборкаДЗ.КоличествоОстатков;
//Если валюта задана и документ заполнен в валюте, это
//позволит сформировать верное значение выручки
//Если валюта не задана, переменная КурсВалюты принимает значение 1
//Выручка так же отразится верно
Движение.Выручка=ВыборкаДЗ.Выручка*КурсВалюты;
Движение.ОтветственныйСотрудник=ОтветственныйСотрудник;
Движение.Контрагент=Покупатель;
КонецЦикла;
КонецПроцедуры
Функция ПолучитьКурсВалюты(Отказ)
//Получаем курс валюты, заданной в документе
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| КурсыВалютСрезПоследних.Курс
|ИЗ
| РегистрСведений.КурсыВалют.СрезПоследних(&МоментВремени, Валюта =
&Валюта) КАК КурсыВалютСрезПоследних";
Запрос.УстановитьПараметр("Валюта", Валюта);
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Если ВыборкаДетальныеЗаписи.Следующий() Тогда
Возврат(ВыборкаДетальныеЗаписи.Курс);
Иначе
Сообщить("Не найден курс валюты!");
Отказ=Истина;
КонецЕсли;
КонецФункции
Процедура ОбработкаПроведенияПоБухучету(Отказ, КурсВалюты)
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДокМ.Номенклатура,
| СУММА(ДокМ.Количество) КАК Количество,
| СУММА(ДокМ.Выручка) КАК Выручка
|ПОМЕСТИТЬ ДокМТч
|ИЗ
| Документ.РеализацияМатериалов.Материалы КАК ДокМ
|ГДЕ
| ДокМ.Ссылка = &Ссылка
|
|СГРУППИРОВАТЬ ПО
| ДокМ.Номенклатура
|;
|
|//////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ХозрасчетныйОстатки.Субконто1,
| СУММА(ХозрасчетныйОстатки.КоличествоОстаток) КАК КоличествоОстаток,
| СУММА(ВЫБОР
| КОГДА ХозрасчетныйОстатки.Субконто2 = &Ответственный
| ТОГДА ХозрасчетныйОстатки.КоличествоОстаток
| КОНЕЦ) КАК КоличествоЗаОтветственным,
| СУММА(ХозрасчетныйОстатки.СуммаОстаток) КАК СуммаОстаток
|ПОМЕСТИТЬ ОстаткиПоСчету
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(
| &МоментВремени,
| Счет = &Счет,
| &Субконто,
| Субконто1 В
| (ВЫБРАТЬ
| ДокМТч.Номенклатура
| ИЗ
| ДокМТч)) КАК ХозрасчетныйОстатки
|
|СГРУППИРОВАТЬ ПО
| ХозрасчетныйОстатки.Субконто1
|;
|
|/////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| ДокМТч.Номенклатура,
| ДокМТч.Количество,
| ДокМТч.Выручка,
| ЕСТЬNULL(ОстаткиПоСчету.КоличествоОстаток, 0) КАК КоличествоОстаток,
| ЕСТЬNULL(ОстаткиПоСчету.КоличествоЗаОтветственным, 0)
КАК КоличествоЗаОтветственным,
| ЕСТЬNULL(ОстаткиПоСчету.СуммаОстаток, 0) КАК СуммаОстаток
|ИЗ
| ДокМТч КАК ДокМТч
| ЛЕВОЕ СОЕДИНЕНИЕ ОстаткиПоСчету КАК ОстаткиПоСчету
| ПО ДокМТч.Номенклатура = ОстаткиПоСчету.Субконто1";
//Устанавливаем параметры запроса
Запрос.УстановитьПараметр("МоментВремени", МоментВремени());
Запрос.УстановитьПараметр("Ответственный", ОтветственныйСотрудник);
Запрос.УстановитьПараметр("Ссылка", Ссылка);
//В этом документе мы имеем дело исключительно со счетом ПрочиеМатериалы
Запрос.УстановитьПараметр
("Счет", ПланыСчетов.Хозрасчетный.ПрочиеМатериалы);
//Этот массив будет передан в качестве параметра виртуальной таблицы остатков
//регистра бухгалтерии
Субконто=Новый Массив(2);
Субконто[0]=ПланыВидовХарактеристик.ВидыСубконто.Номенклатура;
Субконто[1]=ПланыВидовХарактеристик.ВидыСубконто.Сотрудники;
Запрос.УстановитьПараметр("Субконто", Субконто);
//Выполним запрос
Результат = Запрос.Выполнить();
ВыборкаДЗ = Результат.Выбрать();
//Включаем запись движений по регистру бухгалтерии
Движения.Хозрасчетный.Записывать=Истина;
//Обходим полученную выборку
Пока ВыборкаДЗ.Следующий() Цикл
//Проверяем, достаточно ли имеющихся материалов для
//корректного их списания в документе
Если ВыборкаДЗ.Количество>ВыборкаДЗ.КоличествоЗаОтветственным Тогда
Сообщить("Недостаточное количество товара (бухучет) "
+ВыборкаДЗ.Номенклатура+" необходимо "+ВыборкаДЗ.Количество
+", в наличии "+ВыборкаДЗ.КоличествоЗаОтветственным);
Отказ=Истина;
Движения.Хозрасчетный.Записывать=Ложь;
КонецЕсли;
Если Отказ Тогда
//Не идем дальше если Отказ установлен в Истина, то есть
//движения формироваться не будут
Продолжить;
КонецЕсли;
//Формируем движение вида Дт Капитал Кт Материалы - отражаем себестоимость
//Даже если документ отражает продажу материалов за валюту
//Данная запись выглядит так же, как и при расчетах в рублях
Движение=Движения.Хозрасчетный.Добавить();
Движение.Период=Дата;
Движение.СчетДт=ПланыСчетов.Хозрасчетный.Капитал;
Движение.СчетКт=ПланыСчетов.Хозрасчетный.ПрочиеМатериалы;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Номенклатура]
=ВыборкаДЗ.Номенклатура;
Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконто.Сотрудники]
=ОтветственныйСотрудник;
Движение.КоличествоКт=ВыборкаДЗ.Количество;
//Средняя себестоимость в расчете по всем материалам данного вида на счете
Движение.Сумма=ВыборкаДЗ.Количество*ВыборкаДЗ.СуммаОстаток
/ВыборкаДЗ.КоличествоОстаток;
//Формируем движение вида Дт РасчетыСПокупателями Кт Капитал - отражаем выручку
//Если в документе указана валюта, это повлияет на дальнейший
ход выполнения программы
Если Валюта = Справочники.Валюты.ПустаяСсылка() Тогда
//Валюта не задана, формируем движения в рублях, по счету расчетов в рублях
Движение=Движения.Хозрасчетный.Добавить();
Движение.Период=Дата;
Движение.СчетДт=ПланыСчетов.Хозрасчетный.РасчетыСПокупателямиВРублях;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты]
=Покупатель;
Движение.СчетКт=ПланыСчетов.Хозрасчетный.Капитал;
Движение.Сумма=ВыборкаДЗ.Выручка;
Иначе
//Валюта задана, формируем движения в валюте, с пересчетом курса
Движение=Движения.Хозрасчетный.Добавить();
Движение.Период=Дата;
Движение.СчетДт=ПланыСчетов.Хозрасчетный.РасчетыСПокупателямиВВалюте;
Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконто.Контрагенты]
=Покупатель;
Движение.ВалютаДт=Валюта;
Движение.ВалютнаяСуммаДт=ВыборкаДЗ.Выручка;
Движение.СчетКт=ПланыСчетов.Хозрасчетный.Капитал;
Движение.Сумма=ВыборкаДЗ.Выручка*КурсВалюты;
КонецЕсли;
КонецЦикла;
КонецПроцедуры
