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