Здравствуйте! Такой вопрос: Как в Отчет с помощью построительОтчета засунуть штрихкод?!
ПолучитьМакетПостротеляОтчета() вот из за него начинаются проблемы. Выдаёт только КоличествоНачальныйОстаток и КоличествоКонечныйОстаток. Я так понял в отчет выводится первая картинка тогда как мне надо третью.
ШТРИХКОД ДОБАВЛЯЮ ТАК
Код 1C v 8.3 ТЗ = ПостроительОтчета.Результат.Выгрузить();
ТЗ.Колонки.Добавить("Штрихкод",,"Штрихкод");
ПакетДляОтчета = ТЗ;
ОбработкаШК = ВыбираемШК(ТЗ);
ПомещаемШКВПакет(ОбработкаШК);
ПостроительОтчета.ИсточникДанных = Новый ОписаниеИсточникаДанных(ПакетДляОтчета);
ОтборПериодичность = ДобавитьОтборПериодичность();
ПостроительОтчета.Макет = ПолучитьМакетПостротеляОтчета();
ПостроительОтчета.МакетОформления = _ПолучитьМакетОформления();
ПостроительОтчета.ОформитьМакет();
ПостроительОтчета.Параметры.Вставить("ДатаНач", ?(ДатаНач = Дата('00010101000000'), ДатаНач, Новый Граница(НачалоДня(ДатаНач), ВидГраницы.Включая)));
ПостроительОтчета.Параметры.Вставить("ДатаКон", ?(ДатаКон = Дата('00010101000000'), ДатаКон, Новый Граница(КонецДня(ДатаКон), ВидГраницы.Включая)));
ПостроительОтчета.Параметры.Вставить("ДатаНачала", ?(ДатаНач = Дата('00010101000000'), ДатаНач, НачалоДня(ДатаНач)));
ПостроительОтчета.Параметры.Вставить("ДатаКонца", ?(ДатаКон = Дата('00010101000000'), Дата("39991231"), КонецДня(ДатаКон)));
ПостроительОтчета.Выполнить();
ПостроительОтчета.Вывести(ТабличныйДокумент);
<br>
Примеры универсальных функций 1С для
получения Конечных Сальдо Дк и Дт :
Код 1C v 8.х //Перед использованием укажите значения переменных:
знОрганизация = Организация;
КонПериода = ТекущаяДата();
// СКД - Сальдо Конечное Дебетовое
Функция СКД(Счет, ДатаО = Неопределено)
Если ДатаО = Неопределено Тогда ДатаО = КонецДня(КонПериода) КонецЕсли;
СчетПЛ = ПланыСчетов.Хозрасчетный.НайтиПоКоду(Счет);
Если СчетПЛ = ПланыСчетов.Хозрасчетный.ПустаяСсылка() Тогда
Возврат "Нет счета!";
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ХозрасчетныйОстатки.СуммаОстатокДт,
| ХозрасчетныйОстатки.СуммаОстатокКт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&DatO, Счет В ИЕРАРХИИ(&Scet), , Организация = &Organ) КАК ХозрасчетныйОстатки
|";
Запрос.УстановитьПараметр("DatO", Новый Граница(ДатаО, ВидГраницы.Включая));
Запрос.УстановитьПараметр("Scet", СчетПЛ);
Запрос.УстановитьПараметр("Organ", знОрганизация);
Результат = Запрос.Выполнить();
Результат = Результат.Выбрать();
Если Результат.Следующий() Тогда
Возврат Результат.СуммаОстатокДт;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
// СКК - Сальдо Конечное Кредитовое
Функция СКК(Счет, ДатаО = Неопределено)
Если ДатаО = Неопределено Тогда ДатаО = КонецДня(КонПериода) КонецЕсли;
СчетПЛ = ПланыСчетов.Хозрасчетный.НайтиПоКоду(Счет);
Если СчетПЛ = ПланыСчетов.Хозрасчетный.ПустаяСсылка() Тогда
Возврат "Нет счета!";
КонецЕсли;
Запрос = Новый Запрос;
Запрос.Текст = "ВЫБРАТЬ
| ХозрасчетныйОстатки.СуммаОстатокДт,
| ХозрасчетныйОстатки.СуммаОстатокКт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки(&DatO, Счет В ИЕРАРХИИ (&Scet), , Организация = &Organ) КАК ХозрасчетныйОстатки";
Запрос.УстановитьПараметр("DatO", Новый Граница(ДатаО, ВидГраницы.Включая));
Запрос.УстановитьПараметр("Scet", СчетПЛ);
Запрос.УстановитьПараметр("Organ", знОрганизация);
Результат = Запрос.Выполнить();
Результат = Результат.Выбрать();
Если Результат.Следующий() Тогда
Возврат Результат.СуммаОстатокКт;
Иначе
Возврат 0;
КонецЕсли;
КонецФункции
Пример использования:
Код 1C v 8.х ТекЗнач = СКД("04.01")-СКК("05")+СКД("08.05");
"Момент времени" - виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя дату и ССЫЛКУ НА ДОКУМЕНТ)
В 7.7 было понятие ПозицияДокумента, а в 8.x Момент времени
Для получения Остатков, Движений:
МоментВремени - это момент непосредственно
перед позицией документа!
Если Вам необходимо получить момент непосредственно после позиции документа, то через объект Граница:
Код 1C v 8.х МоментСразуПослеДокумента = Новый Граница(ДокументСсылка,ВидГраницы.Включая);
Пример получения остатков на дату документа, но до его движений
Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.Физлицо,
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.СуммаВзаиморасчетовОстаток
|ИЗ
| РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций.Остатки(&МомВрем, Физлицо = &Физик) КАК ВзаиморасчетыСРаботникамиОрганизацийОстатки";
МомВрем = Документы.НачислениеЗарплатыРаботникамОрганизаций.НайтиПоНомеру("00012","31.12.2009 23:59:59");
Запрос.УстановитьПараметр("МомВрем", Новый Граница(МомВрем.МоментВремени(), ВидГраницы.Включая));
Запрос.УстановитьПараметр("Физик", Справочники.ФизическиеЛица.НайтиПоКоду("365"));
ВывестиРезультат(Запрос.Выполнить());
Пример получения остатков на дату документа, включая его движения
Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.Физлицо,
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.СуммаВзаиморасчетовОстаток
|ИЗ
| РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций.Остатки(&МомВрем, Физлицо = &Физик) КАК ВзаиморасчетыСРаботникамиОрганизацийОстатки";
МомВрем = Документы.НачислениеЗарплатыРаботникамОрганизаций.НайтиПоНомеру("00012","31.12.2009 23:59:59");
Запрос.УстановитьПараметр("МомВрем", Новый Граница(МомВрем.МоментВремени(), ВидГраницы.Исключая));
// или так: Запрос.УстановитьПараметр("МомВрем", МомВрем.МоментВремени());
Запрос.УстановитьПараметр("Физик", Справочники.ФизическиеЛица.НайтиПоКоду("365"));
ВывестиРезультат(Запрос.Выполнить());
На форме в табличное поле добавим Колонку (Имя - НачальноеСальдо, Данные - Пусто и все остальное тоже) и колонку КонечноеСальдо
Зайдем в свойства Табличного поля и в событиях определим процедуру при выводе строки: ДействиеПриВыводеСтроки
А в модуле напишем:
Код 1C v 8.х
Процедура ЗарплатаПриВыводеСтроки(Элемент, ОформлениеСтроки, ДанныеСтроки)
//Укажем фильтр получения остатков
Фильтр = Новый Структура;
Фильтр.Вставить("ФизЛицо",ДанныеСтроки.ФизЛицо);
// по подразделению не надо
//Фильтр.Вставить("Подразделение", ДанныеСтроки.Подразделение);
//Остаток до документа
Попытка
НачСальдо = РегистрыНакопления.Взаиморасчеты.Остатки(Новый Граница(Дата, ВидГраницы.Исключая),Фильтр,"ФизЛицо","ВзаимРасчет")[0].ВзаимРасчет;
Исключение // остатка нет
НачСальдо = 0;
КонецПопытки;
//Остаток после документа
Попытка
КонСальдо = РегистрыНакопления.Взаиморасчеты.Остатки(Новый Граница(Дата, ВидГраницы.Включая),Фильтр,"ФизЛицо","ВзаимРасчет")[0].ВзаимРасчет;
Исключение // остатка нет
КонСальдо = 0;
КонецПопытки;
ОформлениеСтроки.Ячейки.НачальноеСальдо.ОтображатьТекст = Истина;
ОформлениеСтроки.Ячейки.НачальноеСальдо.Текст = ?(НачСальдо=0,"",НачСальдо);
ОформлениеСтроки.Ячейки.КонечноеСальдо.ОтображатьТекст = Истина;
ОформлениеСтроки.Ячейки.КонечноеСальдо.Текст = ?(КонСальдо=0,"",КонСальдо);
//Добавим цветовое оформление, чтобы выделить минусовые остатки
Если НачСальдо < 0 Тогда
ОформлениеСтроки.Ячейки.НачальноеСальдо.ЦветФона = Новый Цвет(255, 131, 131);
Иначе
ОформлениеСтроки.Ячейки.НачальноеСальдо.ЦветФона = Новый Цвет(255, 255, 231);
КонецЕсли;
Если КонСальдо < 0 Тогда
ОформлениеСтроки.Ячейки.КонечноеСальдо.ЦветФона = Новый Цвет(255, 131, 131);
Иначе
ОформлениеСтроки.Ячейки.КонечноеСальдо.ЦветФона = Новый Цвет(255, 255, 231);
КонецЕсли;
КонецПроцедуры
При указании конечной даты, указывайте на просто Дату, а Границу!
Например, если нужно получить на конец дня, то указывайте так:
Код 1C v 8.х ГраницаКНД = Новый Граница(КонецДня(Дата), ВидГраницы.Включая);
Запрос.УстановитьПараметр("КонГраница", ГраницаКНД );
Если вы хотите получить остатки до определенного документа или после, то используйте:
Пример получения остатков на дату документа, но до его движений
Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.Физлицо,
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.СуммаВзаиморасчетовОстаток
|ИЗ
| РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций.Остатки(&МомВрем, Физлицо = &Физик) КАК ВзаиморасчетыСРаботникамиОрганизацийОстатки";
МомВрем = Документы.НачислениеЗарплатыРаботникамОрганизаций.НайтиПоНомеру("00012","31.12.2009 23:59:59");
Запрос.УстановитьПараметр("МомВрем", Новый Граница(МомВрем.МоментВремени(), ВидГраницы.Включая));
Запрос.УстановитьПараметр("Физик", Справочники.ФизическиеЛица.НайтиПоКоду("365"));
ВывестиРезультат(Запрос.Выполнить());
Пример получения остатков на дату документа, включая его движения
Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.Физлицо,
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.СуммаВзаиморасчетовОстаток
|ИЗ
| РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций.Остатки(&МомВрем, Физлицо = &Физик) КАК ВзаиморасчетыСРаботникамиОрганизацийОстатки";
МомВрем = Документы.НачислениеЗарплатыРаботникамОрганизаций.НайтиПоНомеру("00012","31.12.2009 23:59:59");
Запрос.УстановитьПараметр("МомВрем", Новый Граница(МомВрем.МоментВремени(), ВидГраницы.Исключая));
// или так: Запрос.УстановитьПараметр("МомВрем", МомВрем.МоментВремени());
Запрос.УстановитьПараметр("Физик", Справочники.ФизическиеЛица.НайтиПоКоду("365"));
ВывестиРезультат(Запрос.Выполнить());
Момент времени:
Фирма 1С описывает так:
Предназначен для получения и хранения момента времени для объекта в базе данных. Содержит дату и время, а также ссылку на объект базы данных. Используется в качестве значений свойств и параметров методов других объектов, имеющих тип МоментВремени.
Момент времени используется в тех случаях, когда важно различать моменты времени для объектов, имеющих одинаковую дату и время, например для сравнения положений документов на временной оси.
А своими словами:
Момент времени - комбинация даты и ссылки на документ. Позволяет разделить и упорядочить документы в пределах одной секунды, выстраивая все документы в однозначную последовательность. Получение данных при проведении на момент времени гарантирует, что будут учтены движения сделанные в ту же секунду что и проводимый документ, но находящиеся перед ним.
Но есть особенность - документы проведенные в одну и ту же секунду располагаются в произвольном порядке, а не в порядке их физического создания (как было в 7.7).
МоментВремени() - это момент непосредственно ПЕРЕД позицией документа (аналог РассчитатьРегистрыНа(ТекущийДокумент() в 7-рке), а если необходимо получить момент непосредственно после позиции документа, то используйте объект Граница
Код 1C v 8.х МоментСразуПослеДокумента = Новый Граница(ДокументСсылка,ВидГраницы.Включая)
Код 1C v 8.х // Пример создает момент времени по дате и ссылке на объект в базе данных.
Момент = Новый МоментВремени(ТекДокумент.Дата, ТекДокумент.Ссылка);
При получение остатков:
"Момент времени" - виртуальное поле, не хранится в базе данных. Содержит объект МоментВремени (который включает в себя ДАТУ и ССЫЛКУ НА ДОКУМЕНТ)
<Виртуальная> таблица остатков не хранится в БД, а строится в момент обращения к ней.
1. подбирается больший или равный значению ПАРАМЕТР момент времени, на который РАССЧИТАНЫ остатки
2. на этот момент получаются остатки из таблицы итогов
3. если момент времени, на который считаются остатки, не совпадает с моментом времени итогов, то остатки ДОСЧИТЫВАЮТСЯ по движениям.
Граница:
Предназначен для получения и хранения границы некоторого интервала значений. Содержит граничное значение интервала, а также признак включения или исключения граничного значения в интервал.
Используется в качестве значений свойств и параметров методов других объектов, имеющих тип Граница.
Граница используется в тех случаях, когда важно указание включения или исключения граничного значения, например при получении остатков и оборотов регистров накопления, срезов и значений регистров сведений, для задания интервалов запросов.
ВидГраницы - Определяет набор видов границ по отношению к граничному значению:
ВидГраницы.Включая - Граница включает граничное значение.
ВидГраницы.Исключая - Граница исключает граничное значение.
Код 1C v 8.х Граница = Новый Граница(Дата, ВидГраницы.Включая);
Запрос.УстановитьПараметр("КонГраница", Граница);
Пример получения остатков на дату документа, включая его движения
Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.Физлицо,
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.СуммаВзаиморасчетовОстаток
|ИЗ
| РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций.Остатки(&МомВрем, Физлицо = &Физик) КАК ВзаиморасчетыСРаботникамиОрганизацийОстатки";
МомВрем = Документы.НачислениеЗарплатыРаботникамОрганизаций.НайтиПоНомеру("00012","31.12.2009 23:59:59");
Запрос.УстановитьПараметр("МомВрем", Новый Граница(МомВрем.МоментВремени(), ВидГраницы.Включая));
Запрос.УстановитьПараметр("Физик", Справочники.ФизическиеЛица.НайтиПоКоду("365"));
ВывестиРезультат(Запрос.Выполнить());
Пример получения остатков на дату документа, но до его движений
Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.Физлицо,
| ВзаиморасчетыСРаботникамиОрганизацийОстатки.СуммаВзаиморасчетовОстаток
|ИЗ
| РегистрНакопления.ВзаиморасчетыСРаботникамиОрганизаций.Остатки(&МомВрем, Физлицо = &Физик) КАК ВзаиморасчетыСРаботникамиОрганизацийОстатки";
МомВрем = Документы.НачислениеЗарплатыРаботникамОрганизаций.НайтиПоНомеру("00012","31.12.2009 23:59:59");
Запрос.УстановитьПараметр("МомВрем", Новый Граница(МомВрем.МоментВремени(), ВидГраницы.Исключая));
// или так: Запрос.УстановитьПараметр("МомВрем", МомВрем.МоментВремени());
Запрос.УстановитьПараметр("Физик", Справочники.ФизическиеЛица.НайтиПоКоду("365"));
ВывестиРезультат(Запрос.Выполнить());
Код 1C v 8.х // Получает разность календарных дат указанного вида. В случае ошибки возвращает -1
Функция ПолучитьРазностьДат(рНачДата,рКонДата,рВидРазности="ДЕНЬ") Экспорт
Если не ЗначениеЗаполнено(рНачДата) или не ЗначениеЗаполнено(рКонДата) Тогда Возврат -1 КонецЕсли;
Если рНачДата=рКонДата Тогда Возврат 0 КонецЕсли;
строСтандПер="СЕКУНДА МИНУТА ЧАС ДЕНЬ НЕДЕЛЯ ДЕКАДА МЕСЯЦ КВАРТАЛ ГОД";
Если Найти(строСтандПер,рВидРазности)=0 Тогда рВидРазности="ДЕНЬ" КонецЕсли;
тз="ВЫБРАТЬ РАЗНОСТЬДАТ(&НачДата,&КонДата,"+СокрЛП(рВидРазности)+")+1 КАК ПериодовВремени";
з=Новый Запрос(тз);
Если рВидРазности="СЕКУНДА" или рВидРазности="МИНУТА" или рВидРазности="ЧАС" Тогда
// ставим, как есть, с учётом времени
Если рНачДата>рКонДата Тогда // всё наоборот
рПервая=рКонДата; рВторая=рНачДата; коэф=-1;
Иначе
рПервая=рНачДата; рВторая=рКонДата; коэф=1;
КонецЕсли;
Иначе
// ставим от начала дня
Если рНачДата>рКонДата Тогда // всё наоборот
рПервая=НачалоДня(рКонДата); рВторая=НачалоДня(рНачДата); коэф=-1;
Иначе
рПервая=НачалоДня(рНачДата); рВторая=НачалоДня(рКонДата); коэф=1;
КонецЕсли;
КонецЕсли;
Попытка
з.УстановитьПараметр("НачДата",рПервая);
з.УстановитьПараметр("КонДата",рВторая);
рРезультат=з.Выполнить().Выгрузить(ОбходРезультатаЗапроса.Прямой).Получить(0).ПериодовВремени;
Если ТипЗнч(рРезультат)<>Тип("Число") Тогда Возврат -1 Иначе Возврат коэф*рРезультат КонецЕсли;
Исключение
Возврат -1
КонецПопытки;
КонецФункции
Функция ДобавитьКДате(рДата,рРазность,рВидРазности="ДЕНЬ") Экспорт
Если рРазность=0 Тогда Возврат рДата КонецЕсли;
строСтандПер="СЕКУНДА МИНУТА ЧАС ДЕНЬ НЕДЕЛЯ ДЕКАДА МЕСЯЦ КВАРТАЛ ГОД";
Если Найти(строСтандПер,рВидРазности)=0 Тогда рВидРазности="ДЕНЬ" КонецЕсли;
тз="ВЫБРАТЬ ДОБАВИТЬКДАТЕ(&УслДата,"+СокрЛП(рВидРазности)+",&УслРазность) КАК РезДата";
з=Новый Запрос(тз);
з.УстановитьПараметр("УслДата",рДата);
з.УстановитьПараметр("УслРазность",рРазность);
рРезультат=з.Выполнить().Выгрузить(ОбходРезультатаЗапроса.Прямой).Получить(0).РезДата;
Если ТипЗнч(рРезультат)<>Тип("Дата") Тогда Возврат Дата(1,1,1) Иначе Возврат рРезультат КонецЕсли;
КонецФункции
Функция ГраницаПериода(рДата,рВидПериода="ДЕНЬ",рВидГраницы) Экспорт
строСтандПер="СЕКУНДА МИНУТА ЧАС ДЕНЬ НЕДЕЛЯ ДЕКАДА МЕСЯЦ КВАРТАЛ ГОД";
Если Найти(строСтандПер,рВидПериода)=0 Тогда рВидПериода="ДЕНЬ" КонецЕсли;
Если Найти(ВРег(рВидГраницы),"НАЧ")<>0 Тогда
рГраница="НАЧАЛОПЕРИОДА";
ИначеЕсли Найти(ВРег(рВидГраницы),"КОН")<>0 Тогда
рГраница="КОНЕЦПЕРИОДА";
Иначе
Возврат рДата;
КонецЕсли;
тз="ВЫБРАТЬ "+рГраница+"(&УслДата,"+СокрЛП(рВидПериода)+") КАК РезДата";
з=Новый Запрос(тз);
з.УстановитьПараметр("УслДата",рДата);
рРезультат=з.Выполнить().Выгрузить(ОбходРезультатаЗапроса.Прямой).Получить(0).РезДата;
Если ТипЗнч(рРезультат)<>Тип("Дата") Тогда Возврат Дата(1,1,1) Иначе Возврат рРезультат КонецЕсли;
КонецФункции