Как установить отбор в табличной части программно? Часто требуется в табличной части установить отбор по нужному значению.
Ниже приведены 2 примера:
Код 1C v 8.3 // В ТЧ "Товары" отображать только те строки, у которых в колонке "КолВо" содержится значение 10
Элементы.Товары.ОтборСтрок = Новый ФиксированнаяСтруктура("КолВо", 10);
// При позиционировании на строке ТЧ "Контрагенты" в событии ПриАктивизацииСтроки()
// накладывать отбор на ТЧ "Договоры": отображать только договоры по текущему контрагенту
&НаКлиенте
Процедура КонтрагентыПриАктивизацииСтроки(Элемент)
ТекущиеДанные = Элементы.Контрагенты.ТекущиеДанные;
Если ТекущиеДанные = Неопределено Тогда
// ТЧ Контрагенты пустая
Элементы.Договоры.ОтборСтрок = Неопределено;
Иначе
// Для ТЧ Договоры устанавливаем отбор по текущему контрагенту
ТекущийКонтрагент = ТекущиеДанные.Контрагент;
Элементы.Договоры.ОтборСтрок = Новый ФиксированнаяСтруктура("Контрагент", ТекущийКонтрагент);
КонецЕсли;
КонецПроцедуры
Посмотрите более подробную статью Табличная часть ~ Как настроить отбор строк?
Категория:
Работа с Формой (Диалог) и её элементами ДеревоЗначений в ТекстовыйДокумент Код 1C v 8.2 УП // Выводит данные ДереваЗначений в ТекстовыйДокумент, пригодный к рассмотрению в отладчике, окне сообщений и показу.
//
// Параметры:
// рВетка - дерево значений, подлежащее выводу. Может иметь почти любую глубину иерархии, количество и тип колонок. Если хватит
// объявленных позиционных строк-заполнителей, всё поместится. Если иерархия слишком глубока, строки просто надо нарастить;
// рТекст - на входе должен быть равен Неопределено; на выходе по окончании работы содержит результатный текстовый документ;
// рПараметры - структура дополнительных настроек, допустимые ключи:
// Колонки - структура колонок, которые подлежат выводу. Если пуста или имеет тип, отличный от структуры, выводятся все колонки;
// если в ключах структуры указаны имена колонок, будут выведены только они. В значениях структуры можно передать строковое
// представление формата, согласно которому должны будут форматироваться выводимые значения. По умолчанию формата нет;
// ПоказыватьУровни - булево, управляет выводом №№ уровней (метод Уровень()), по умолчанию выключено;
// ШагОтступа - число, определяющее шаг в символах, используемый для показа псевдографики иерархии веток в дереве.
//
&НаСервереБезКонтекста
Процедура ВывестиДеревоЗначенийВТекст(Знач рВетка,рТекст,Знач рПараметры=Неопределено)
Попытка
Если рТекст=Неопределено Тогда // первая итерация, шапочный вызов исходной части
//---------------------------------------------------------------------------------------------------------------------------
// Разбираем входные данные
Если ТипЗнч(рВетка)<>Тип("ДеревоЗначений") Тогда Возврат КонецЕсли;
Если ТипЗнч(рПараметры)<>Тип("Структура") Тогда рПараметры=Новый Структура КонецЕсли;
стрКолонок=?(рПараметры.Свойство("Колонки"),рПараметры.Колонки,Неопределено);
Если ТипЗнч(стрКолонок)<>Тип("Структура") Тогда стрКолонок=Новый Структура КонецЕсли;
рПоказыватьУровни=?(рПараметры.Свойство("ПоказыватьУровни"),рПараметры.ПоказыватьУровни,Ложь); // затратное дело, кстати
рШагОтступа=?(рПараметры.Свойство("ШагОтступа"),рПараметры.ШагОтступа,2); // для отображения отступа в колонке иерархии
//---------------------------------------------------------------------------------------------------------------------------
// Определяем максимальное количество уровней
// Также можно получить максимальный уровень, "плоско" перебрав все строки (например, получив их через НайтиСтроки)
// и в цикле для каждой вызывая Уровень() и определяя максимум.
// Вариант через СКД и служебное поле "Уровень" ни на одной известной мне платформе не работоспособен (нехватка памяти).
//
//
//рДеревоДляТеста=КакНибудьСкопироватьДерево(рВетка);
//рДеревоДляТеста.Колонки.Вставить(0,"_Level",Новый ОписаниеТипов("Булево")); // самый экономный вариант, с сохранением иерархии
//мНенужных=Новый Массив;
//Для й=1 По рДеревоДляТеста.Колонки.Количество()-1 Цикл
// мНенужных.Добавить(рДеревоДляТеста.Колонки[й]);
//КонецЦикла;
//Для каждого кол Из мНенужных Цикл
// рДеревоДляТеста.Колонки.Удалить(кол);
//КонецЦикла;
//
рДеревоДляТеста=рВетка; // пока сериализуем прямо всё дерево (неоптимально, но...)
рЗапись=Новый ЗаписьXML;
рЗапись.УстановитьСтроку();
СериализаторXDTO.ЗаписатьXML(рЗапись,рДеревоДляТеста);
стро=рЗапись.Закрыть();
//
стро=СтрЗаменить(стро,"xmlns=","xmlns:myns1C="); // иначе не будет работать XPath
//
рЧтение=Новый ЧтениеXML;
рЧтение.УстановитьСтроку(стро);
постр=Новый ПостроительDOM;
рДокументДОМ=постр.Прочитать(рЧтение);
рВыражение="/ValueTree/row"; максКолвоУровней=1;
рРазыменователь=Новый РазыменовательПространствИменDOM(рДокументДОМ);
Пока Истина Цикл
#Если Клиент Тогда
ОбработкаПрерыванияПользователя();
#КонецЕсли
рРезультат=рДокументДОМ.ВычислитьВыражениеXPath(рВыражение,рДокументДОМ,рРазыменователь,ТипРезультатаDOMXPath.Любой);
Если рРезультат.ПолучитьСледующий()=Неопределено Тогда Прервать КонецЕсли;
рВыражение=рВыражение+"/row";
максКолвоУровней=максКолвоУровней+1;
КонецЦикла;
максКолвоУровней=максКолвоУровней-1; // можно и так: СтрЧислоВхождений(рВыражение,"/row")-1;
//---------------------------------------------------------------------------------------------------------------------------
// готовим исходный макет вывода
строПробелы=" ";
строРазделители="===============================================================================================";
строОтступы="___________________________________________________________________________________________"; // тут нужны чуть для другого
//
секШапка1="|[_HCS"+Лев(строПробелы,максКолвоУровней*рШагОтступа)+"]|"; // HierarchyColumnShow
секГорРазделитель1="|"+Лев(строОтступы,максКолвоУровней*рШагОтступа+6)+"|"; // здесь именно Отступы!
рШиринаКолонкиИерархии=СтрДлина(секШапка1)-2;
строПолейШапки="#Поле _HCS
| #Выравнивание Центр";
строПолейЗаписи="";
//
Если рПоказыватьУровни Тогда
секШапка1=секШапка1+"[_Level]|";
секГорРазделитель1=секГорРазделитель1+Лев(строРазделители,8)+"|";
строПолейШапки=строПолейШапки+"
|#Поле _Level
| #Выравнивание Центр";
строПолейЗаписи="#Поле _Level
| #Выравнивание Центр
| #Забивать Истина";
КонецЕсли;
//
мИменКолонок=Новый Массив;
Для каждого кол Из рВетка.Колонки Цикл
Если стрКолонок.Количество()<>0 и не стрКолонок.Свойство(кол.Имя) Тогда Продолжить КонецЕсли; // чётко указаны конкретные колонки
рДлинаИмениКолонки=СтрДлина(кол.Имя);
рНужнаяШирина=Макс(?(кол.Ширина<3,10,кол.Ширина),рДлинаИмениКолонки);
// к сожалению, ключевое слово "#Поля" неприменимо - платформа падает - поэтому делаем всё сами
секШапка1=секШапка1+"["+кол.Имя+Лев(строПробелы,рНужнаяШирина-рДлинаИмениКолонки)+"]|";
секГорРазделитель1=секГорРазделитель1+Лев(строРазделители,рНужнаяШирина+1)+"=|";
строПолейШапки=строПолейШапки+"
|#Поле "+кол.Имя+"
| #Выравнивание Центр";
рОписТипов=кол.ТипЗначения;
Если рОписТипов.Типы().Количество()=1 и рОписТипов.СодержитТип(Тип("Булево")) Тогда
рВыравнивание="Центр";
ИначеЕсли рОписТипов.СодержитТип(Тип("Число")) Тогда
рВыравнивание="Право";
ИначеЕсли рОписТипов.СодержитТип(Тип("Строка")) и рОписТипов.КвалификаторыСтроки.Длина=0 Тогда
рВыравнивание="ПоШирине";
Иначе
рВыравнивание="Лево";
КонецЕсли;
строПолейЗаписи=строПолейЗаписи+?(ПустаяСтрока(строПолейЗаписи),"",Символы.ПС)+"#Поле "+кол.Имя+"
| #Выравнивание "+рВыравнивание;
Попытка
Если ЗначениеЗаполнено(стрКолонок[кол.Имя]) Тогда // указан формат, уточняющий показ колонки
строПолейЗаписи=строПолейЗаписи+"
| #Формат """+СокрЛП(стрКолонок[кол.Имя])+"""";
КонецЕсли;
Исключение
КонецПопытки;
мИменКолонок.Добавить(кол.Имя);
КонецЦикла;
секШапка2=СтрЗаменить(СтрЗаменить(секШапка1,"[","<"),"]",">");
секЗапись1=секШапка1; секЗапись2=секШапка2; // пусть они по дизайну пока не отличаются
секГорРазделитель2=СтрЗаменить(СтрЗаменить(секГорРазделитель1,"=","-"),"|","+");
// обработаем нормальное обрамление шапки колонки иерархии
секГорРазделитель1=СтрЗаменить(секГорРазделитель1,"_","=");
секГорРазделитель2=СтрЗаменить(секГорРазделитель2,"_"," ");
//
тМакет=Новый ТекстовыйДокумент;
тМакет.ДобавитьСтроку("#Область Шапка");
тМакет.ДобавитьСтроку(строПолейШапки);
тМакет.ДобавитьСтроку(секГорРазделитель1);
тМакет.ДобавитьСтроку(секШапка1);
тМакет.ДобавитьСтроку(секШапка2);
тМакет.ДобавитьСтроку(секГорРазделитель1);
тМакет.ДобавитьСтроку("#КонецОбласти");
тМакет.ДобавитьСтроку("");
тМакет.ДобавитьСтроку("#Область Запись");
тМакет.ДобавитьСтроку(строПолейЗаписи);
тМакет.ДобавитьСтроку(секЗапись1);
тМакет.ДобавитьСтроку(секЗапись2);
тМакет.ДобавитьСтроку(секГорРазделитель2);
тМакет.ДобавитьСтроку("#КонецОбласти");
рПараметры.Вставить("ИсходныйМакет",тМакет); // пусть будет
//---------------------------------------------------------------------------------------------------------------------------
// Запускаем вывод в итоговый документ
рТекст=Новый ТекстовыйДокумент;
сек=тМакет.ПолучитьОбласть("Шапка");
сек.Параметры._HCS="Иерархия";
Для каждого имякол Из мИменКолонок Цикл
кол=рВетка.Колонки[имякол];
сек.Параметры[кол.Имя]=?(ПустаяСтрока(кол.Заголовок),кол.Имя,кол.Заголовок);
КонецЦикла;
рТекст.Вывести(сек);
//
пар=Новый Структура;
пар.Вставить("МассивИмёнКолонок",мИменКолонок);
пар.Вставить("ТекущаяСекция",тМакет.ПолучитьОбласть("Запись"));
пар.Вставить("ШиринаКолонкиИерархии",рШиринаКолонкиИерархии);
пар.Вставить("ПоказыватьУровни",рПоказыватьУровни);
пар.Вставить("Отступ",0);
пар.Вставить("ШагОтступа",рШагОтступа);
ВывестиДеревоЗначенийВТекст(рВетка,рТекст,пар);
Иначе
// очередная итерация, вывод в текстовый документ
мИменКолонок=рПараметры.МассивИмёнКолонок;
рСекция=рПараметры.ТекущаяСекция;
рОтступ=рПараметры.Отступ;
рШиринаКолонкиИерархии=рПараметры.ШиринаКолонкиИерархии;
рПоказыватьУровни=рПараметры.ПоказыватьУровни;
//
строОтступы="_________________________________________________________________________________________________________";
строПробелы=" ";
//
пар=Новый Структура;
пар.Вставить("МассивИмёнКолонок",мИменКолонок);
пар.Вставить("ТекущаяСекция",рПараметры.ТекущаяСекция);
пар.Вставить("ШиринаКолонкиИерархии",рШиринаКолонкиИерархии);
пар.Вставить("ПоказыватьУровни",рПоказыватьУровни);
пар.Вставить("ШагОтступа",рПараметры.ШагОтступа);
пар.Вставить("Отступ",рОтступ+рПараметры.ШагОтступа);
//
Для каждого рПодветка Из рВетка.Строки Цикл
рСекция.Параметры._HCS=Лев(строПробелы,рОтступ)+"\"+Лев(строОтступы,рШиринаКолонкиИерархии-рОтступ-1);
Если рПоказыватьУровни Тогда
рСекция.Параметры._Level=рПодветка.Уровень();
КонецЕсли;
Для каждого имякол Из мИменКолонок Цикл
рСекция.Параметры[имякол]=рПодветка[имякол];
КонецЦикла;
рТекст.Вывести(рСекция);
ВывестиДеревоЗначенийВТекст(рПодветка,рТекст,пар)
КонецЦикла;
//
КонецЕсли;
Исключение
Сообщить("ВывестиДеревоЗначенийВТекст, ошибка: "+ОписаниеОшибки(),СтатусСообщения.ОченьВажное);
КонецПопытки;
КонецПроцедуры
Источник
Категория:
Работа с Деревом Значений Как получить количество рабочих дней в месяце по календарю? Для одного проекта потребовалось получить количество рабочих дней в месяце по календарю, без учета праздников.
В результате получилась простая функция:
Код 1C v 8.3 Функция ПолучитьКолВоРабочихДнейПоКалендарю(ДатаМесяца)
Рабочие=0;
Кон=НачалоМесяца(ДатаМесяца); КонМес = КонецМесяца(ДатаМесяца);
Пока Кон<=КонМес Цикл
Если (ДеньНедели(Кон)=6) или (ДеньНедели(Кон)=7)Тогда
//выходные дни не считаем
Иначе
Рабочие=Рабочие+1;
КонецЕсли;
Кон=Кон+86400;
КонецЦикла;
Возврат Рабочие;
КонецФункции
А получить количество Выходных дней в месяце можно так:
Код 1C v 8.3 Функция ПолучитьКолВоРабочихДнейПоКалендарю(ДатаМесяца)
Вых=0;
Кон=НачалоМесяца(ДатаМесяца); КонМес = КонецМесяца(ДатаМесяца);
Пока Кон<=КонМес Цикл
Если (ДеньНедели(Кон)=6) или (ДеньНедели(Кон)=7)Тогда
Вых=Вых+1;
КонецЕсли;
Кон=Кон+86400;
КонецЦикла;
Возврат Вых;
КонецФункции
Категория:
Работа с Датами (Временем) Разница между датами в рабочих днях, подсчет рабочих дней в 1С Разрабатывая некий функционал в 1С, бывает, необходимо посчитать количество рабочих дней после какой-то даты.
В этой статье примеры кода и запросы в которых считается количество рабочих дней:
Код, при вычислении определяет только по дню недели, викидывая выходные. Праздники не учитывает!
Код 1C v 8.х Функция РабочихДнейСДаты(НачДата,КолвоДней) Экспорт
Перем РабочихДней, ОбычныхДней, ДеньНедели;
РабочихДней = 0; ОбычныхДней = 0;
Пока РабочихДней < Число(КолвоДней) Цикл
ОбычныхДней = ОбычныхДней+ 1;
// определим день недели
ДеньНедели=ДеньНедели(НачДата+(ОбычныхДней*86400));
// если не выходной, то прошел еще один рабочий день
Если ДеньНедели < 6 Тогда
РабочихДней=РабочихДней+1;
КонецЕсли;
КонецЦикла;
Возврат (НачДата + (РабочихДней*86400));
КонецФункции
// Пример использования
ТриДняОтОбработки = РабочихДнейСДаты(нДатаОбработки,3);
Если РабочаяДата>ТриДняОтОбработки Тогда
Предупреждение("Прошло больше 3-х дней после обработки заказа. Цены не актуальны!
|Отправьте заказ на новую обработку! ");
Иначе
// ... неки код
КонецЕсли;
В запросе, с использованием производственного календаря и учетом всех праздников:
Код 1C v 8.х ВЫБРАТЬ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря КАК Дата
ПОМЕСТИТЬ Даты
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ГДЕ
РегламентированныйПроизводственныйКалендарь.ДатаКалендаря В(&ВходящиеДаты)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
Даты.Дата,
КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК КоличествоРабочихДней,
МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) КАК ДатаКалендаря,
РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря КАК ДатаКалендаряДляГруппировки
ИЗ
РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь
ВНУТРЕННЕЕ СОЕДИНЕНИЕ Даты КАК Даты
ПО (Даты.Дата <= РегламентированныйПроизводственныйКалендарь.ДатаКалендаря)
И (ДОБАВИТЬКДАТЕ(Даты.Дата, ДЕНЬ,ГлубинаДней) > РегламентированныйПроизводственныйКалендарь.ДатаКалендаря)
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.РегламентированныйПроизводственныйКалендарь КАК РегламентированныйПроизводственныйКалендарь1
ПО РегламентированныйПроизводственныйКалендарь.ДатаКалендаря <= РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
ГДЕ
(РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Предпраздничный)
ИЛИ РегламентированныйПроизводственныйКалендарь.ВидДня = ЗНАЧЕНИЕ(Перечисление.ВидыДнейПроизводственногоКалендаря.Рабочий))
СГРУППИРОВАТЬ ПО
РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря,
Даты.Дата
ИМЕЮЩИЕ
МАКСИМУМ(РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) = РегламентированныйПроизводственныйКалендарь1.ДатаКалендаря
И КОЛИЧЕСТВО(РАЗЛИЧНЫЕ РегламентированныйПроизводственныйКалендарь.ДатаКалендаря) =РабочихДней
Еще один вариант, в котором допустим, что:
1) Регистр сведений Календарь имеет структуру (Измерения={ДатаКалендаря}, Ресурсы={ВидДня}), а перечисление ВидыДня задано как {Рабочий, Предпразничный} и праздничные дни в календаре отсутствуют.
2) В документе Реализация заданы поля Дата и ОтсрочкаДней. Тогда:
Код 1C v 8.х Выбрать
Р.Ссылка, Р.Дата,
минимум(isnull(К.ДатаКалендаря, добавитькдате(Р.Дата, день, Р.ОтсрочкаДней))) как ДатаКредита
из Документ.Реализация как Р
левое соединение РегистрСведений.Календарь как К
по добавитькдате(Р.Дата, день, Р.ОтсрочкаДней) <= К.ДатаКалендаря
сгруппировать по
Р.Ссылка, Р.Дата
Собственно, если календарь содержит и праздничные дни, то можно добавить секцию ГДЕ, и там отобрать только рабочие дни. В секции ГДЕ можно отобрать и интересующий календарь, если ведется несколько календарей.
Категория:
Работа с Датами (Временем) Как сформировать диаграмму с типом График В этом примере построим диаграмму с типом График , вида:
Вот код ее формирования:
Код 1C v 8.х Процедура ГрафикКолВоДоставок()
//Создаем таблицу данных
ТабД = Новый ТаблицаЗначений;
ТабД.Колонки.Добавить("ДатаК");
ТабД.Колонки.Добавить("Всего");
кп = КонПериодаЛ;
нп = кп-(86400);
Пока кп>НачПериодаЛ Цикл
Состояние("Кол-во Доставок на: "+ Строка(кп));
КоличествоДоставок = 0; Тоннаж = 0;
Привилегированный.ПолучитьКоличествоДоставок(кп, КоличествоДоставок, Тоннаж);
Нстр = ТабД.Добавить();
Нстр.ДатаК=кп;
Нстр.Всего = КоличествоДоставок;
кп = нп;
нп = кп-(86400);
КонецЦикла;
ДиаграммаВП = ЭлементыФормы.ДиаграммаКолВоДоставок;
ДиаграммаВП.КоличествоТочек=0;
ТабД.Сортировать("ДатаК Возр");
Для Каждого СтрТраб из ТабД Цикл
Точка=ДиаграммаВП.Точки.Добавить(Формат(СтрТраб.Получить(0),"ДФ=dd.MM"));
Индекс=0;
//Для Каждого Серия из ДиаграммаВП.Серии Цикл
Попытка
ДиаграммаВП.УстановитьЗначение(Точка,ДиаграммаВП.Серии[0],?(СтрТраб.Получить(1)=Неопределено,0,СтрТраб.Получить(1)));
Исключение
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Категория:
Диаграмма Как сформировать диаграмму с типом Гистограмма объемная В этом примере формируется диаграмма с типом Гистограмма объемная
Данные получаем запросом:
Код 1C v 8.х ДатаЗапроса = НачалоДня(ТекущаяДата());
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ВЫБОР
| КОГДА СостояниеДоставки.НетМашины
| ТОГДА ""Нет машины""
| ИНАЧЕ ВЫБОР
| КОГДА СостояниеДоставки.СостояниеРазгрузки = ЗНАЧЕНИЕ(Перечисление.СостояниеРазгрузки.ПустаяССылка)
| ТОГДА СостояниеДоставки.СостояниеЗагрузки
| ИНАЧЕ СостояниеДоставки.СостояниеРазгрузки
| КОНЕЦ
| КОНЕЦ КАК Статус,
| СУММА(1) КАК КолВо
|ИЗ
| РегистрСведений.СостояниеДоставки КАК СостояниеДоставки
|ГДЕ
| СостояниеДоставки.Период = &Период
|
|СГРУППИРОВАТЬ ПО
| ВЫБОР
| КОГДА СостояниеДоставки.НетМашины
| ТОГДА ""Нет машины""
| ИНАЧЕ ВЫБОР
| КОГДА СостояниеДоставки.СостояниеРазгрузки = ЗНАЧЕНИЕ(Перечисление.СостояниеРазгрузки.ПустаяССылка)
| ТОГДА СостояниеДоставки.СостояниеЗагрузки
| ИНАЧЕ СостояниеДоставки.СостояниеРазгрузки
| КОНЕЦ
| КОНЕЦ";
Запрос.УстановитьПараметр("Период", ДатаЗапроса);
ДиаграммаВП = ЭлементыФормы.ДиаграммаТекСтатус;
ДиаграммаВП.КоличествоТочек=0;
Точка=ДиаграммаВП.Точки.Добавить(Формат(ДатаЗапроса,"ДФ=dd.MM"));
Результат = Запрос.Выполнить();
Выборка = Результат.Выгрузить();
Для каждого СтрокаТЗ Из Выборка Цикл
Если СокрЛП(СтрокаТЗ.статус) = "Нет машины" Тогда
ДиаграммаВП.УстановитьЗначение(Точка,ДиаграммаВП.Серии[5],СтрокаТЗ.КолВо);
ИначеЕсли СокрЛП(СтрокаТЗ.статус) = "В пути" Тогда
ДиаграммаВП.УстановитьЗначение(Точка,ДиаграммаВП.Серии[2],СтрокаТЗ.КолВо);
ИначеЕсли СокрЛП(СтрокаТЗ.статус) = "Загрузка" Тогда
ДиаграммаВП.УстановитьЗначение(Точка,ДиаграммаВП.Серии[3],СтрокаТЗ.КолВо);
ИначеЕсли СокрЛП(СтрокаТЗ.статус) = "На объекте" Тогда
ДиаграммаВП.УстановитьЗначение(Точка,ДиаграммаВП.Серии[1],СтрокаТЗ.КолВо);
ИначеЕсли СокрЛП(СтрокаТЗ.статус) = "Завершено" Тогда
ДиаграммаВП.УстановитьЗначение(Точка,ДиаграммаВП.Серии[0],СтрокаТЗ.КолВо);
ИначеЕсли СокрЛП(СтрокаТЗ.статус) = "Нет разрешения" Тогда
ДиаграммаВП.УстановитьЗначение(Точка,ДиаграммаВП.Серии[4],СтрокаТЗ.КолВо);
КонецЕсли;
КонецЦикла;
Категория:
Диаграмма Удаление пустых колонок в таблице значений Код 1C v 8.х Процедура УдалитьПустыеКолонкиТЗ(ТЗ)
МассивВозможноПустыхКолонок=Новый Массив;
Для Каждого ТекКолонка Из ТЗ.Колонки Цикл
МассивВозможноПустыхКолонок.Добавить(ТекКолонка.Имя);
КонецЦикла;
Для Каждого СтрТЗ из ТЗ Цикл
КолВоВозможноПустыхКолонок=МассивВозможноПустыхКолонок.Количество();
Для К=1 по КолВоВозможноПустыхКолонок Цикл
Если ЗначениеЗаполнено(СтрТЗ[МассивВозможноПустыхКолонок[КолВоВозможноПустыхКолонок-К]]) Тогда
МассивВозможноПустыхКолонок.Удалить(КолВоВозможноПустыхКолонок-К);
КонецЕсли;
КонецЦикла;
КонецЦикла;
КолВоВозможноПустыхКолонок=МассивВозможноПустыхКолонок.Количество();
Для К=0 по КолВоВозможноПустыхКолонок-1 Цикл
ТЗ.Колонки.Удалить(МассивВозможноПустыхКолонок[К]);
КонецЦикла;
КонецПроцедуры
Категория:
Работа с Таблицей Значений Сообщение «Деление на 0» Это сообщение возникает в том случае, если в алгоритме конфигурации Используется деление и не выполняется проверка значения делителя. Обычно эта ошибка возникает из-за того, что не заполнены какие-либо данные (сумма, количество, коэффициенты и т.п.). Необходимые для работы алгоритма данные должны быть заполнены, например, в документе или справочнике, элемент которого выбран в документе. Обычно эта проблема решается вводом необходимых для работы алгоритма данных и повторным запуском алгоритма (формирования отчета или проведения документов).
Решение:
в коде
Код 1C v 8.х //Просто проверка на то что Делитель не равен 0
Если Число(ШиринаБумаги) <> 0 Тогда
КолвоБумСПриладкой = КолвоБумаги / Число(ШиринаБумаги);
КонецЕсли;
в запросе:
Код 1C v 8.х ВЫБОР
КОГДА ПартииТоваровНаСкладахОстатки.КоличествоОстаток = 0 ТОГДА 0
ИНАЧЕ ЕСТЬNULL(ПартииТоваровНаСкладахОстатки.СтоимостьОстаток / ПартииТоваровНаСкладахОстатки.КоличествоОстаток, 0)
КОНЕЦ КАК Себестоимость
Категория:
1С Общие вопросы - Обычные формы Простое штрихкодирование документов Была поставлена задача на предприятии, где ежедневно выписывается по 300-500 накладных организовать штрихкодирование документов, для более удобной работы с бумажным носителем в дальнейшем. И вот результат…
Конфигурация “Торговля и склад”. Хотелось сделать как можно проще и быстрее, и в тоже время надежно. На решение задачи ушло 1,5 часа. И так приступим….
У нас будет использоваться штрихкод EAN13. Создаем общий реквизит документов:
Общий реквизит документов "EAN13"
Тип – “Строка”, длина – 13, отбор по реквизиту
Добавляем в глобальный модуль процедуру
Код 1C v 7.x //******************************************************************************
// глСформироватьШтрихкодДокумента(Конт)
//
// Параметры:
// Конт - контекст документа для которого необходимо сформировать штрихкод
// EAN13- реквизит документа содержащий штрихкод
// Возвращаемое значение:
// Нет
//
// Описание:
// На основании номера документа и вида документа формирует штрихкод в формате
// EAN
//
Процедура глСформироватьШтрихкодДокумента(Конт, EAN13) Экспорт
Если ПустаяСтрока(EAN13) = 1 Тогда
ПрефиксыДокументов = СоздатьОбъект("СписокЗначений");
ПрефиксыДокументов.ДобавитьЗначение("001", "Реализация");
ПрефиксыДокументов.ДобавитьЗначение("002", "СчетФактураВыданный");
// и т.д
КодДокумента = СокрЛП(Прав(Конт.НомерДок,7));
КодВидаДокумента = ПрефиксыДокументов.Получить(Конт.Вид());
Префикс = Прав(ДатаГод(Конт.ДатаДок), 2);
ИспКолво = 10;
Штрихкод = СимволыВЦифры(Прав(СокрЛП(КодДокумента+КодВидаДокумента),
ИспКолво));
Штрихкод = Префикс + глДополнитьСтрокуЛ(Штрихкод, "0", ИспКолво);
EAN13 = Штрихкод + глКонтрольныйСимволEAN(Штрихкод, 13);
КонецЕсли;
КонецПроцедуры // глСформироватьШтрихкодДокумента()
После этого в документы, которым будут присваиваться штрихкоды добавляем вызов
вышеописанного в процедуру "ПриЗаписи()"
Код 1C v 7.x Процедура ПриЗаписи()
//..............................
глСформироватьШтрихкодДокумента(Контекст, EAN13);
КонецПроцедуры
В результате при первой записи документа ему будет присвоен штрихкод состоящий
из следующих блоков:
1. год документа (2 символа);
2. семь цифр справа от номера документа;
3. код вида документа (3 символа);
4. контрольный символ;
Осталось только вставить в печатную форму объект ActiveBarcode и настроить
необходимые свойства у него.
А вот и результат
Автор:
Александр Шкураев Категория:
Штрих-код (barcode) Форма ~ Получение списка открытых окон и вывод свойств элементов Код 1C v 8.х Функция ПолучитьСписокОткрытыхОкон() Экспорт
ВключатьФормыЭлементов = ЭтаФорма.ВладелецФормы.ЭлементыФормы.ВключатьФормыЭлементов.Значение;
// Определим перебором, сколько у нас объектов в системе
КолвоОбъектов = 0;
Для Каждого ТипОбъекта Из ВсеТипы Цикл
Если (ТипОбъекта.Ключ <> "Константы") и (ТипОбъекта.Ключ <> "ОбщиеФормы") Тогда
Для каждого Объект из Метаданные[ТипОбъекта.Ключ] Цикл
Для каждого Фрм из Объект.Формы Цикл
КолвоОбъектов = КолвоОбъектов + 1;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
ЭлементыФормы.ХодВыполненияОперации.МинимальноеЗначение = 1;
ЭлементыФормы.ХодВыполненияОперации.МаксимальноеЗначение = КолвоОбъектов;
ЭлементыФормы.ХодВыполненияОперации.Шаг = 100 / КолвоОбъектов;
КолвоОбъектов = 0;
сзСписокОкон = Новый СписокЗначений;
// Перебор типов метаданных
Для Каждого ТипОбъекта Из ВсеТипы Цикл
Если (ТипОбъекта.Ключ <> "Константы") и (ТипОбъекта.Ключ <> "ОбщиеФормы") Тогда
Для каждого Объект из Метаданные[ТипОбъекта.Ключ] Цикл
Если ВключатьФормыЭлементов И(ТипОбъекта.Ключ = "Справочники" Или ТипОбъекта.Ключ = "Документы") Тогда
// для элементов справочников и документов
Менеджер = Вычислить((ТипОбъекта.Ключ + "[Объект.Имя]"));
Выборка = Менеджер.выбрать();
пока Выборка.Следующий() Цикл
ФормаЭлем = Выборка.Ссылка.ПолучитьФорму();
Если ФормаЭлем.Открыта() Тогда
сзСписокОкон.Добавить(ФормаЭлем, Строка(Выборка.Ссылка) + " (" + Объект.Имя + ", форма элемента)");
КонецЕсли;
КонецЦикла;
КонецЕсли;
Для каждого Фрм из Объект.Формы Цикл
Форма = Вычислить(ТипОбъекта.Ключ + "[Объект.Имя].ПолучитьФорму(Фрм)");
КолвоОбъектов = КолвоОбъектов + 1;
ЭлементыФормы.ХодВыполненияОперации.Значение = КолвоОбъектов;
Попытка
Если Форма.открыта() Тогда
сзСписокОкон.Добавить(Форма, Объект.Имя + " (" + Фрм + ")");
КонецЕсли;
Исключение
Сообщить("ошибка");
КонецПопытки;
КонецЦикла;
КонецЦикла;
КонецЕсли;
КонецЦикла;
Возврат сзСписокОкон;
КонецФункции
Категория:
Работа с Формой (Диалог) и её элементами Удаление строк из табличной части документа, все или по условию. Удалить все строки табличного поля документа.
Код 1C v 8.х ОтражениеВУчете.Очистить(); // ОтражениеВУчете - название табличного поля
Как в табличной части документа удалить строки только с нулевым значением реквизита "Количество"?
Код 1C v 8.х //Получим документ и укажем параметры поиска
ОбъектДок = СсылкаДок.ПолучитьОбъект();
СтруктураДляПоиска = Новый Структура("Количество", 0);
ТабличнаяЧастьДок = ОбъектДок.Товары;
//Получаем список строк соответсвтвующих отбору, и перебором удаляем.
МассивПустыхСтрок = ТабличнаяЧастьДок.НайтиСтроки(СтруктураДляПоиска);
Для каждого Строка Из МассивПустыхСтрок Цикл
ТабличнаяЧастьДок.Удалить(Строка);
КонецЦикла;
ОбъектДок.Записать(); // Записываем изменения в документе
Как удалить все строки, кроме тех которые соответсвуют заданному отбору?
Код 1C v 8.х // Укажем условия отбора: Нужно оставить только строки где СубконтоКт1 = РБПНаПФР
ПараметрыОтбора = Новый Структура("СубконтоКт1", Справочники.РасходыБудущихПериодов.РБПНаПФР);
//Теперь выгружаем табличную часть в таблицу значений
ТЗисходн=ОтражениеВУчете.Выгрузить();
//Скопируем ТЗ с заданным отбором в новую ТЗ
ТЗнов = ТЗисходн.Скопировать(ПараметрыОтбора);
//Очистим табличную часть
ОтражениеВУчете.Очистить();
//Загружем в табличную часть новую таблицу значений
ОтражениеВУчете.Загрузить(ТЗнов);
В режиме управляемого приложения конструкция:
Код 1C v 8.2 УП Для каждого Запись из ТабличнойЧасти Цикл
Если Запись.НадоУдалить Тогда
ТабличнойЧасти.Удалить(Запись);
КонецЕсли;
КонецЦикла;
Работает некорректно, так как переписывает табличную часть и меняет индексы, сразу после удаления и Цикл полностью не обходит.
Решение пришло такое:
Код 1C v 8.2 УП КолВо = Объект.ТабличнойЧасти.Количество()-1;
ИндексСтроки = КолВо;
Для счетчик = 0 по КолВо Цикл
Запись = Объект.ТабличнойЧасти.Получить(ИндексСтроки);
если Запись.НадоУдалить тогда
Объект.ТабличнойЧасти.Удалить(Запись);
КонецЕсли;
ИндексСтроки = ИндексСтроки - 1;
КонецЦикла;
Категория:
Документы Как выгрузиться в EXCEL со сводными таблицами Пошаговый рабочий алгоритм выгрузки в EXCEL на примере выгрузки отчетов производства за смену(Автор статьи:
Funny ):
(1) Нарисовать форму обработки и к кнопке запуска прицепить процедуру:
Код 1C v 8.х Процедура КнопкаВыполнитьНажатие(Кнопка)
Если ПроверкаДат() Тогда
Состояние("Запущена выгрузка данных");
ПолучитьДанныеВТаблице();
Если чОтчетов<>0 Тогда
СортироватьТаблицу();
ВыгрузитьТаблицуВФайл();
ЗакрытьСистему();
Состояние("Выгрузка завершена");
Иначе
//ЗакрытьСистемуАварийно();
КонецЕсли;
КонецЕсли;
КонецПроцедуры
(2) Создадим функцию ПроверкаДат() корректного указания дат обработки
(3) Создадим процедуру ПолучитьДанныеВТаблице() выборки требуемых данных из документов в таблицу значений
(4) Создадим процедуру СортироватьТаблицу() для сортировки таблицы значений как нам нужно
(5) Создадим процедуру ВыгрузитьТаблицуВФайл() выгрузки ТЗ в Excel-файл:
Код 1C v 8.х Процедура ВыгрузитьТаблицуВФайл()
//1. Open Excel-file
Если FileOfReports = Неопределено Тогда
Попытка
FileOfReports = Новый COMОбъект("Excel.Application");
MyBook=FileOfReports.WorkBooks.Add(истина); //вместо истина можно вставить имя шаблона
FirstSheet=MyBook.Worksheets(1);
FirstSheet.Name = ОпределитьДату(НачПериода)+"-"+ОпределитьДату(КонПериода);
FirstSheet.Activate();
MyBook.SaveAs(КаталогDBF+"ОтчетыПроизводства.xls");
Исключение
Сообщить("ОШИБКА ЗАПИСИ В EXCEL-ФАЙЛ:"+ОписаниеОшибки());
Сообщить("Совет: Возможно файл, в который должна быть произведена запись, Вами открыт для просмотра");
Сообщить("Если это так, то закройте файл и запустите данную обработку повторно!");
КонецПопытки;
FileOfReports.Visible = 0;
Иначе
FileOfReports.Visible = 0;
//FileOfReports.Visible = 1;
КонецЕсли;
//2.=========================================================================
//Состояние("Анализ структуры файла...");
чОтчетов = ТаблицаОтчетов.Количество();
ЭлементыФормы.ИндикаторЗагрузки.МинимальноеЗначение = 0;
ЭлементыФормы.ИндикаторЗагрузки.МаксимальноеЗначение = чОтчетов;
ЭлементыФормы.Logo.Заголовок = "Выгружаю документы";
лСчетчикИндикатора = 0;
ВыгрузитьЗаголовокТаблицы(26);
//ВЫГРУЖАЮ ТАБЛИЦУ В ФАЙЛ ПО СТРОКАМ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
фСтарт=истина; //флаг первого прохода
чОт=2; //номер первой строки с данными
Пока чОтчетов >= 1 Цикл //Цикл по строкам Таблицы отчетов
чОтчетов = чОтчетов -1;
СтрокаОтчетов = ТаблицаОтчетов.Получить(чОтчетов);
Если (СтрокаОтчетов.ДатаВыпуска=ДатаВыпускаПред)
И (СтрокаОтчетов.Принадлежность=ПринадлежностьПред)
И (СтрокаОтчетов.Типоразмер=ТипоразмерПред)
И (СтрокаОтчетов.ТипОсновы=ТипОсновыПред)
Тогда
Иначе
ДатаВыпускаПред=СтрокаОтчетов.ДатаВыпуска;
ПринадлежностьПред=СтрокаОтчетов.Принадлежность;
ТипоразмерПред=СтрокаОтчетов.Типоразмер;
ТипОсновыПред=СтрокаОтчетов.ТипОсновы;
Если фСтарт Тогда
фСтарт = ложь; //Уже не первый проход
Иначе
чДо=глСчетчикСтрок;
ВыгрузитьСтрокуИтог(чОт,чДо,26);
КонецЕсли;
чОт=глСчетчикСтрок;
КонецЕсли;
ВыгрузитьСтрокуОтчетовВФайл(СтрокаОтчетов,26);
лСчетчикИндикатора = лСчетчикИндикатора + 1;
ЭлементыФормы.ИндикаторЗагрузки.Значение = лСчетчикИндикатора;
ОбработкаПрерыванияПользователя();
КонецЦикла;
чДо=глСчетчикСтрок;
ВыгрузитьСтрокуИтог(чОт,чДо,26);
//КОНЕЦ ВЫГРУЗКИ СТРОК В ФАЙЛ
Состояние("Данные файла выгружены");
//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
libСообщитьНК1("ИНФО: ШАГ 1 ВЫПОЛНЕН. Данные файла Отчеты.DBF успешно считаны",1);
//Состояние("Создание сводных таблиц");
ЭлементыФормы.Logo.Заголовок = "Создание сводных таблиц";
//РазделитьОбласти();
//Range("A2").S_elect
//ActiveWindow.FreezePanes = True
СоздатьТаблицуЛист(MyBook.Worksheets(1).Name,"наим","Дата","Наим","","К");
СоздатьТаблицуЛист(MyBook.Worksheets(1).Name,"ЮВ","Дата","Наим,Каркас,Вид","","К");
СоздатьТаблицуЛист(MyBook.Worksheets(1).Name,"В пр(2)","Дата","Наим,Каркас,Основа","","К");
СоздатьТаблицуЛист(MyBook.Worksheets(1).Name,"В пр","Дата","Каркас,Основа","","К");
СоздатьТаблицуЛист(MyBook.Worksheets(1).Name,"Основа","Дата","Основа","","кг основы");
СоздатьТаблицуЛист(MyBook.Worksheets(1).Name,"Напыление","","Напылен","","кг напылен");
СоздатьТаблицуЛист(MyBook.Worksheets(1).Name,"Клей","","Дата","","кг клея");
КонецПроцедуры
Процедура СоздатьТаблицуЛист(стрДанные,стрСводнаяТаблица,стрПоле1,стрПоле2,стрПоле3,стрПоле4);
//Создает сводную таблицу стрСводнаяТаблица с полями (стрПоле4 - поле реквизита)
//и размещает ее на одноименном листе
//Заполняет сводную таблицу данными, взятыми с листа стрДанные
//Поле стрПоле2 может быть полем списка через запятую
//0. Вспомогательный разбор списка значений в стрПоле2 и определение числа значений
лПоля.Очистить(); //сбросим все значения, если таковые весели в памяти
стрПоля=стрПоле2;
i=1;//число значений в списке
Пока Найти(стрПоля,",")<>0 Цикл
n=Найти(стрПоля,",");
лПоля.Добавить(Сред(стрПоля,1,n-1));
стрПоля=Сред(стрПоля,n+1);
i=i+1;
КонецЦикла;
лПоля.Добавить(стрПоля);
//1. Установить диапазон выборки данных
FirstSheet.Activate();
дДиапазонДанных=FirstSheet.UsedRange.Address;
ДиапазонДанных=FirstSheet.Name+"!"+Строка(дДиапазонДанных);
//2. Создать кэш под сводную таблицу
// аргументы не переменные, а текст с именем переменных (crazy)
SourceType = xlDatabase;
SourceData = ДиапазонДанных;
Cache = MyBook.PivotCaches().Add(SourceType, SourceData);
//для отладки: FileOfReports.Visible = 1;
//3. Породить из кэша сводную таблицу с именем стрСводнаяТаблица
TableDestination="";
TableName=стрСводнаяТаблица;
Cache.CreatePivotTable(TableDestination,TableName);
//4. Определить представление данных в сводной таблице
//стрПоле1
Если СокрЛП(стрПоле1)<>"" Тогда
MyBook.ActiveSheet.PivotTables(TableName).PivotFields(стрПоле1).Orientation = 3; //xlRowField=1 то, что указывается справа у таблицы
КонецЕсли;
//стрПоле2
чНомер=0;
Пока чНомер<i Цикл
Если СокрЛП(лПоля[чНомер].Значение)<>"" Тогда
MyBook.ActiveSheet.PivotTables(TableName).PivotFields(лПоля[чНомер].Значение).Orientation = 1;
КонецЕсли;
чНомер = чНомер + 1;
КонецЦикла;
//стрПоле3
Если СокрЛП(стрПоле3)<>"" Тогда
MyBook.ActiveSheet.PivotTables(TableName).PivotFields(стрПоле3).Orientation = 2; //xlColumnField=2 то, что указывается в вепрхней части таблицы
КонецЕсли;
//стрПоле4
Если СокрЛП(стрПоле4)<>"" Тогда
MyBook.ActiveSheet.PivotTables(TableName).PivotFields(стрПоле4).Orientation = 4; //xlCount=4 data
КонецЕсли;
//5. Скрыть пустые строки в стрПоле2, предварительно проверив, что таковые СУЩЕСТВУЮТ!!!!
//стрПоле2
чНомер=0;
Пока чНомер<i Цикл
Если СокрЛП(лПоля[чНомер].Значение)<>"" Тогда
Если IfPivotItemExists(TableName,лПоля[чНомер].Значение,"(пусто)")Тогда
MyBook.ActiveSheet.PivotTables(TableName).PivotFields(лПоля[чНомер].Значение).PivotItems("(пусто)").Visible = False;
КонецЕсли;
КонецЕсли;
чНомер = чНомер + 1;
КонецЦикла;
//6. Закрыть вспомогательные панели
MyBook.ShowPivotTableFieldList = False;
FileOfReports.CommandBars("PivotTable").Visible = False;
//7. Присвоить активному листу имя, заданное в параметрах процедуры
MyBook.ActiveSheet.Name = стрСводнаяТаблица;
//8. Сохранить файл
MyBook.Save();
КонецПроцедуры
Функция IfPivotItemExists(strTableName,strFieldName,strItemName)
//Проверяет существование позиции поля сводной таблицы со значением strItemName
nItems = MyBook.ActiveSheet.PivotTables(strTableName).PivotFields(strFieldName).PivotItems().Count;
i = 1;
Пока i <= nItems Цикл
Если strItemName=MyBook.ActiveSheet.PivotTables(strTableName).PivotFields(strFieldName).PivotItems(i).Name Тогда
//Искомая позиция strItemName существует:
//Сообщить("Позиция "+strItemName+" найдена");
Возврат True;
КонецЕсли;
i=i+1;
КонецЦикла;
//Сообщить("Позиция "+strItemName+" не найдена");
Возврат False;
КонецФункции
Код 1C v 7.x РабочаяКнига = СоздатьОбъект("Excel.Application");
РабочаяКнига.SheetsInNewWorkbook = 1;
РабочаяКнига.Caption = "Отчет по договорам отгрузки";
NewBook = РабочаяКнига.Workbooks;
List = NewBook.Add;
СписокСтолбцов = СоздатьОбъект("СписокЗначений");
СписокСтолбцов.ДобавитьЗначение("Модель");
СписокСтолбцов.ДобавитьЗначение("Разнорядка");
СписокСтолбцов.ДобавитьЗначение("По договору");
СписокСтолбцов.ДобавитьЗначение("Отгрузили");
СписокСтолбцов.ДобавитьЗначение("Осталось");
//Заполним наименование столбцов: Модель, Разнорядка, Количество
Для Столбец = 1 По СписокСтолбцов.РазмерСписка() Цикл
Ячейка = РабочаяКнига.Cells(1,Столбец);
Ячейка.Value = СписокСтолбцов.ПолучитьЗначение(Столбец);
КонецЦикла;
//Формируем запрос по регистру
// //Создание объекта типа Запрос
Запрос = СоздатьОбъект("Запрос");
ТекстЗапроса =
"//{{ЗАПРОС(Сформировать)
|Период с ДатаНач по ДатаКон;
|Разнорядка = Регистр.УчетДоговоров.Разнорядка;
|Модель = Регистр.УчетДоговоров.Модель.Группа;
|Колво = Регистр.УчетДоговоров.Количество;
|Функция КолвоПриход = Приход(Колво);
|Функция КолвоРасход = Расход(Колво);
|Функция КолвоОст = КонОст(Колво);
|Группировка Разнорядка;
|Группировка Модель;
|"//}}ЗАПРОС
;
// Если ошибка в запросе, то выход из процедуры
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
НомерСтроки = 1;
Пока Запрос.Группировка("Разнорядка") = 1 Цикл
Пока Запрос.Группировка("Модель") = 1 Цикл
Модель = Запрос.Модель;
Разнорядка = Запрос.Разнорядка;
КолПоДоговору = Запрос.КолвоПриход;
КолОтгрузили = Запрос.КолвоРасход;
КолОсталось = Запрос.КолвоОст;
НомерСтроки = НомерСтроки + 1;
//Организум заполнение ячеек Excel
Для Ст = 1 По СписокСтолбцов.РазмерСписка() Цикл
Ячейка = РабочаяКнига.Cells(НомерСтроки,Ст);
Если Ст = 1 Тогда
Ячейка.Value = Модель;
ИначеЕсли Ст = 2 Тогда
Ячейка.Value = Строка(Разнорядка);
ИначеЕсли Ст = 3 Тогда
Ячейка.Value = КолПоДоговору;
ИначеЕсли Ст = 4 Тогда
Ячейка.Value = КолОтгрузили;
ИначеЕсли Ст = 5 Тогда
Ячейка.Value = КолОсталось;
КонецЕсли;
КонецЦикла;
КонецЦикла;
КонецЦикла;
СводнаяТаблица = РабочаяКнига.ActiveSheet.PivotTableWizard;
//Метод СводнаяТаблица.Name возвращает имя сводной таблицы
//Можно задать имя таблицы СводнаяТаблица.Name = "МояТаблица"
СводнаяТаблица.SmallGrid = 0;
//Разворачивает макет сводной таблицы
//Обращение к ячейкам сводной таблицы возможно по номеру
//Например, СводнаяТаблица.PivotFields(1).Value
//возвращает значение "Модель"
//Попробуем с другого конца
//1 - Row
//2 - Column
//3 - Page
//4 - Data
СводнаяТаблица.PivotFields(1).Orientation = 1; //Модель
СводнаяТаблица.PivotFields(2).Orientation = 3; //Разнорядка
СводнаяТаблица.PivotFields(3).Orientation = 4; //По договору
СводнаяТаблица.PivotFields(4).Orientation = 4; //Отгрузили
СводнаяТаблица.PivotFields(5).Orientation = 4; //Осталось
//Пройдемся по форме отчета
СводнаяТаблица.Format(1);
//Попробуем закрыть панель инструментов сводной таблицы
РабочаяКнига.CommandBars("PivotTable").Visible = 0;
РабочаяКнига.Visible = 1;
Категория:
Работа с Microsoft Office и OpenOffice Получение остатков регистра запросом, с группировкой по продукту и цене Код 1C v 7.x ДатаК=РабочаяДата();
Запрос=СоздатьОбъект("Запрос");
ТекстЗапроса=
"//{{ЗАПРОС(ОстаткиТоваров)
|Период с '01.01.1990' по ДатаК;
|Продукт=Регистр.ПродОст.Продукция;
|Цена=Регистр.ПродОст.Цена;
|Колво=Регистр.ПродОст.Количество;
|Вес=Регистр.ПродОст.Вес;
|Функция КолвоНачОст=НачОст(КолВо);
|Функция КолвоПриход=Приход(КолВо);
|Функция КолвоРасход=Расход(КолВо);
|Функция КолвоКонОст=КонОст(КолВо);
|Функция ВесНачОст=НачОст(Вес);
|Функция ВесПриход=Приход(Вес);
|Функция ВесРасход=Расход(Вес);
|Функция ВесКонОст=КонОст(Вес);
|Группировка Продукт;
|Группировка Цена;
|"//}}ЗАПРОС
;
Если Запрос.Выполнить(ТекстЗапроса) = 0 Тогда
Возврат;
КонецЕсли;
Сообщить("1");
//... код вывода
Пока Запрос.Группировка("Продукт") = 1 Цикл
Сообщить("2");
//... код вывода
Пока Запрос.Группировка("Продукт") = 1 Цикл
Сообщить("3");
//... код вывода
КонецЦикла;
КонецЦикла;
Сообщить("4");
//... код вывода
Категория:
Регистры Сводные Остатки регистра остатков Метод работает аналогично процедуре Остатки, однако здесь могут быть заданы не все значения измерений, а только несколько,
но обязательно в правильной последовательности, соответствующей структуре измерений данного регистра, как она задана в конфигураторе.
Измерения могут задаваться с пропусками (неуказанное значение — просто запятая), фиксируются только указанные измерения.
Код 1C v 7.x // Пример 1
// Для регистра с измерениями «Товар», «Склад», «МОЛ» запись
Рег.СводныеОстатки(Тов1, , );
//означает, что ресурсы будут получены только по одному товару (Тов1), но по всем складам и всем МОЛам.
Процедура ПолучитьСводныеОстатки(Товар, ОстатокТовара, Стоимость);
Регистр.УчетТовара.СводныеОстатки(Товар, );
ОстатокТовара = Регистр.УчетТовара.ОстаткиТовара;
Стоимость = Регистр.УчетТовара.СтоимостьТовара;
КонецПроцедуры
// Пример 2
РегТовары = СоздатьОбъект("Регистр.Товары")
//получить сводные остатки по товару
РегТовары.СводныеОстатки(ТекТовар,); //указано только одно измерение
КолвоТовара = РегТовары.Количество;
СтоимостьТовара = РегТовары.Стоимость;
//получить стоимость всех товаров на данном складе
РегТовары.СводныеИтоги(,ТекСклад); //указано только одно измерение
СтоимостьПоСкладу = РегТовары.Стоимость;
Категория:
Регистры Сводный Остаток регистра остатков Данный метод работает аналогично методу Остаток, однако здесь могут быть заданы не все значения измерений, а только несколько,
но обязательно в правильной последовательности, соответствующей структуре измерений данного регистра, как она задана в конфигураторе.
Измерения могут задаваться с пропусками (неуказанное значение — просто запятая), фиксируются только указанные измерения.
Код 1C v 7.x // Пример 1
// Для регистра с измерениями «Товар», «Склад», «МОЛ» запись
Рег.СводныйОстаток(Тов1, , "ОстатокТовара");
//означает, что ресурс «ОстатокТовара» будет получен только по одному товару (Тов1), но по всем складам и всем МОЛам.
Процедура ПолучитьСводныйОстаток(Товар, Ост);
Ост = Регистр.УчетТовара.СводныйОстаток(Товар, , "ОстаткиТовара");
КонецПроцедуры
// Пример 2
РегТовары = СоздатьОбъект("Регистр.Товары")
//получить остаток данного товара на всех складах
КолвоТовара = РегТовары.СводныйОстаток (ТекТовар,,"Количество");
СтоимостьТовара = РегТовары.СводныйОстаток (ТекТовар,,"Стоимость");
//получить стоимость всех товаров на данном складе
СтоимостьПоСкладу = РегТовары.СводныйОстаток (,ТекСклад,"Стоимость");
Отзывы об казино
888старс от реальных игроков с опытом игры в данном игровом заведении.
Категория:
Регистры