Как программно сформировать отчет СКД указав параметры и на выходе получить таблице значений? В одном документе для расчета потребовалось получать данные из отчета на СКД, реализовал следующим образом:
Код 1C v 8.х //Програмное формирование отчета СКД
СхемаОст = Отчеты.ТоннажПоЭкспедиторам.ПолучитьМакет("ОсновнаяСхемаКомпоновкиДанных");
КомпоновщикНастроекНастройки = Новый КомпоновщикНастроекКомпоновкиДанных;
КомпоновщикНастроекНастройки.Инициализировать(Новый ИсточникДоступныхНастроекКомпоновкиДанных(СхемаОст));
КомпоновщикНастроекНастройки.ЗагрузитьНастройки(СхемаОст.НастройкиПоУмолчанию);
КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("НачалоПериода", НачалоМесяца(МесяцРасчета));
КомпоновщикНастроекНастройки.Настройки.ПараметрыДанных.УстановитьЗначениеПараметра("КонецПериода", КонецМесяца(МесяцРасчета));
КомпоновщикМакета = Новый КомпоновщикМакетаКомпоновкиДанных;
МакетКомпоновкиДанных = КомпоновщикМакета.Выполнить(СхемаОст, КомпоновщикНастроекНастройки.Настройки, , , Тип("ГенераторМакетаКомпоновкиДанныхДляКоллекцииЗначений"));
ПроцессорКомпоновкиДанных = Новый ПроцессорКомпоновкиДанных;
ПроцессорКомпоновкиДанных.Инициализировать(МакетКомпоновкиДанных);
ПроцессорВывода = Новый ПроцессорВыводаРезультатаКомпоновкиДанныхВКоллекциюЗначений;
ДанныеТЗ = Новый ТаблицаЗначений;
ПроцессорВывода.УстановитьОбъект(ДанныеТЗ);
ПроцессорВывода.Вывести(ПроцессорКомпоновкиДанных);
ТоннажПоЭкспедиторам.Очистить();
// ДанныеТЗ.ВыбратьСтроку();
Для каждого СтрокаТЗ Из ДанныеТЗ Цикл
Если ЗначениеЗаполнено(СтрокаТЗ.Экспедитор) и СтрокаТЗ.Доставка=Неопределено Тогда
нСтр = ТоннажПоЭкспедиторам.Добавить();
ЗаполнитьЗначенияСвойств(нСтр,СтрокаТЗ);
нСтр.Сотрудник=СтрокаТЗ.Экспедитор;
Иначе
Продолжить;
КонецЕсли;
КонецЦикла;
Категория:
Схема Компоновки Данных Как получить количество рабочих дней в месяце по календарю? Для одного проекта потребовалось получить количество рабочих дней в месяце по календарю, без учета праздников.
В результате получилась простая функция:
Код 1C v 8.3 Функция ПолучитьКолВоРабочихДнейПоКалендарю(ДатаМесяца)
Рабочие=0;
Кон=НачалоМесяца(ДатаМесяца); КонМес = КонецМесяца(ДатаМесяца);
Пока Кон<=КонМес Цикл
Если (ДеньНедели(Кон)=6) или (ДеньНедели(Кон)=7)Тогда
//выходные дни не считаем
Иначе
Рабочие=Рабочие+1;
КонецЕсли;
Кон=Кон+86400;
КонецЦикла;
Возврат Рабочие;
КонецФункции
А получить количество Выходных дней в месяце можно так:
Код 1C v 8.3 Функция ПолучитьКолВоРабочихДнейПоКалендарю(ДатаМесяца)
Вых=0;
Кон=НачалоМесяца(ДатаМесяца); КонМес = КонецМесяца(ДатаМесяца);
Пока Кон<=КонМес Цикл
Если (ДеньНедели(Кон)=6) или (ДеньНедели(Кон)=7)Тогда
Вых=Вых+1;
КонецЕсли;
Кон=Кон+86400;
КонецЦикла;
Возврат Вых;
КонецФункции
Категория:
Работа с Датами (Временем) Как заполнить табличную часть формы программно? Нужно по кнопке Заполнить - сформировать данные для заполнения табличных частей и заполнить их.
Форма имеет вид:
Рядом с кнопкой Записать и закрыть добавлена кнопка Заполнить документ , код ее команды:
Код 1C v 8.2 УП // Код заполнения ТЧ
&НаСервере
Процедура ЗаполнитьДокументНаСервере()
ДокОбъект = РеквизитФормыВЗначение("Объект");
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ РАЗЛИЧНЫЕ
| ЗаказНаПроизводствоПродукция.Ссылка КАК ЗаказНаПроизводство,
| СпецификацииОперации.Операция,
| СпецификацииОперации.W1C_КоличествоОпераций,
| СпецификацииОперации.W1C_СтоимостьОднойОперации
|ПОМЕСТИТЬ втЗаказОперацияСумма
|ИЗ
| Документ.ЗаказНаПроизводство.Продукция КАК ЗаказНаПроизводствоПродукция
| ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Спецификации.Операции КАК СпецификацииОперации
| ПО ЗаказНаПроизводствоПродукция.Спецификация = СпецификацииОперации.Ссылка
|ГДЕ
| ЗаказНаПроизводствоПродукция.Ссылка В
| (ВЫБРАТЬ РАЗЛИЧНЫЕ
| W1C_ОтчетПоВыработкеНачисления.ЗаказПроизводство
| ИЗ
| Документ.W1C_ОтчетПоВыработке.Начисления КАК W1C_ОтчетПоВыработкеНачисления
| ГДЕ
| W1C_ОтчетПоВыработкеНачисления.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК)
|;
|
|////////////////////////////////////////////////////////////////////////////////
|ВЫБРАТЬ
| W1C_ОтчетПоВыработкеНачисления.Ссылка.Организация,
| W1C_ОтчетПоВыработкеНачисления.Ссылка.Сотрудник,
| W1C_ОтчетПоВыработкеНачисления.ЗаказПроизводство,
| W1C_ОтчетПоВыработкеНачисления.Операция,
| W1C_ОтчетПоВыработкеНачисления.КоличествоПродукции КАК Количество,
| втЗаказОперацияСумма.W1C_СтоимостьОднойОперации КАК Цена,
| W1C_ОтчетПоВыработкеНачисления.Ссылка КАК ОтчетПоВыработке,
| втЗаказОперацияСумма.W1C_СтоимостьОднойОперации * W1C_ОтчетПоВыработкеНачисления.КоличествоПродукции КАК Сумма
|ИЗ
| Документ.W1C_ОтчетПоВыработке.Начисления КАК W1C_ОтчетПоВыработкеНачисления
| ЛЕВОЕ СОЕДИНЕНИЕ втЗаказОперацияСумма КАК втЗаказОперацияСумма
| ПО W1C_ОтчетПоВыработкеНачисления.ЗаказПроизводство = втЗаказОперацияСумма.ЗаказНаПроизводство
| И W1C_ОтчетПоВыработкеНачисления.Операция = втЗаказОперацияСумма.Операция
|ГДЕ
| W1C_ОтчетПоВыработкеНачисления.Ссылка.Дата МЕЖДУ &ДатаН И &ДатаК
| И W1C_ОтчетПоВыработкеНачисления.Ссылка.Организация = &Организация";
Запрос.УстановитьПараметр("ДатаК", КонецМесяца(ДокОбъект.ПериодРегистрации));
Запрос.УстановитьПараметр("ДатаН", НачалоМесяца(ДокОбъект.ПериодРегистрации));
Запрос.УстановитьПараметр("Организация", ДокОбъект.Организация);
РезультатЗапроса = Запрос.Выполнить();
ДокОбъект.Рассчет.Загрузить(Запрос.Выполнить().Выгрузить());
ОбновитьВыплату(ДокОбъект); //заполним данными вторую ТЧ
ЗначениеВРеквизитФормы(ДокОбъект, "Объект");
КонецПроцедуры
&НаСервере
Процедура ОбновитьВыплату(ДокОбъект)
врТЗ = ДокОбъект.Рассчет.Выгрузить();
врТЗ.свернуть("Сотрудник","Сумма");
ДокОбъект.Начисления.Загрузить(врТЗ);
КонецПроцедуры
Второй вариант заполнения: Имеем ТЧ на форме, которую необходимо программно заполнить
и код в модуле документа:
Код 1C v 8.2 УП &НаСервере
Процедура НайтиТопливоф()
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| СУММА(ПродажаТоплива.Номер) КАК Номер,
| ПродажаТоплива.ТипТоплива,
| СУММА(ПродажаТоплива.Количество) КАК Количество,
| СУММА(ПродажаТоплива.СуммаСНДС) КАК СуммаСНДС
|ИЗ
| Документ.ПродажаТоплива КАК ПродажаТоплива
|ГДЕ
| ПродажаТоплива.Цена <= &Цена
|
|СГРУППИРОВАТЬ ПО
| ПродажаТоплива.ТипТоплива";
Запрос.УстановитьПараметр("Цена", Объект.Цена);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Объект.ТЧ.Очистить();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
НовСтр = Объект.ТЧ.Добавить();
ЗаполнитьЗначенияСвойств(НовСтр, ВыборкаДетальныеЗаписи); //при условии что имена полей ТЧ и выборки совпадают
КонецЦикла;
КонецПроцедуры
Категория:
Управляемое приложение, Тонкий клиент Настройка периода, интервала динамического списка Вот несколько вариантов
Программной установки периода, интервала динамического списка на управляемой форме
Код 1C v 8.2 УП Элементы.ДинамическийСписок.Период = Новый СтандартныйПериод(ВариантСтандартногоПериода.Сегодня);
//или
Элементы.Список.Период = Новый СтандартныйПериод(ВариантСтандартногоПериода.ЭтотКвартал);
Код 1C v 8.2 УП
Элементы.Список.Период.Вариант = СтруктураПараметров.Период.Вариант;
Элементы.Список.Период.ДатаНачала = СтруктураПараметров.Период.ДатаНачала;
Элементы.Список.Период.ДатаОкончания = СтруктураПараметров.Период.ДатаОкончания;
//Или
СП = Элементы.Список.Период;
СП.ДатаНачала = НачалоМесяцы(РабочаяДата);
СП.ДатаОкончания = КонецМесяца(РабочаяДата);
Категория:
Документы Как узнать количество дней в месяце? Код 1C v 8.х Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| ДЕНЬ(КОНЕЦПЕРИОДА(&Дата, МЕСЯЦ)) КАК ЧислоДней";
Запрос.УстановитьПараметр("Дата", Дата);
Результат = Запрос.Выполнить();
ВыборкаДетальныеЗаписи = Результат.Выбрать();
Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
// Вставить обработку выборки ВыборкаДетальныеЗаписи
КонецЦикла;
Код 1C v 8.х КоличествоДней = Сред(КонецМесяца(ТекущаяДата()), 1, 2);
Категория:
Работа с Датами (Временем) Вывод (печать) Запроса в Табличный Документ Код 1C v 8.х // OldthiefXXX
//Процедура формирует и выводит отчет по переданноме запросу
// Параметры :
//* ПараметрыОтчета - структура
// Пример параметров:
//* ПараметрыОтчета = Новый Структура;
//* ПараметрыОтчета .Вставить("Запрос",текст);
//* ПараметрыЗапроса=Новый Структура;
//* ПараметрыЗапроса.Вставить("Номенклатура",ТоварИзАртикула.Ссылка);
//* ПараметрыЗапроса.Вставить("НачалоМесяца",НачалоМесяца(ДатаВедомости));
//* ПараметрыЗапроса.Вставить("КонецМесяца",КонецМесяца(ДатаВедомости));
//* ПараметрыОтчета .Вставить("ПараметрыЗапроса",ПараметрыЗапроса);
Процедура УниверсальныйОтчетПоЗапросу(ПараметрыОтчета)
Запрос=новый Запрос;
Запрос.Текст=ПараметрыОтчета.Запрос;
Для каждого ПАРАМЕТР из ПараметрыОтчета.ПараметрыЗапроса Цикл
Запрос.УстановитьПараметр(ПАРАМЕТР.Ключ,ПАРАМЕТР.Значение);
КонецЦикла;
Тз=Запрос.Выполнить().Выгрузить();
Табл=Новый ТабличныйДокумент;
Макет = ЭтотОбъект.ПолучитьМакет("Макет");
ОбластьШапкаОсновной=Макет.ПолучитьОбласть("Шапка|Основной");
ОбластьСтрокаОсновной=Макет.ПолучитьОбласть("Строка|Основной");
ОбластьИтогОсновной=Макет.ПолучитьОбласть("Итог|Основной");
ОбластьШапкаДОП=Макет.ПолучитьОбласть("Шапка|Показатели");
ОбластьСтрокаДОП=Макет.ПолучитьОбласть("Строка|Показатели");
ОбластьИтогДОП=Макет.ПолучитьОбласть("Итог|Показатели");
Табл.Вывести(ОбластьШапкаОсновной);
Для Каждого Колонка из Тз.Колонки ЦИКЛ
ОбластьШапкаДОП.Параметры.ИмяПоказателя=Колонка.Имя;
Табл.Присоединить(ОбластьШапкаДОП);
КонецЦикла;
счетчик=0;
Для каждого стр из Тз Цикл
счетчик=счетчик+1;
ОбластьСтрокаОсновной.Параметры.счетчик=счетчик;
Табл.Вывести(ОбластьСтрокаОсновной);
Для Каждого Колонка из Тз.Колонки ЦИКЛ
ОбластьСтрокаДОП.Параметры.ЗначениеКолонки=стр[Колонка.Имя];
Табл.Присоединить(ОбластьСтрокаДОП);
КонецЦикла;
КонецЦикла;
Табл.Вывести(ОбластьИтогОсновной);
Для Каждого Колонка из Тз.Колонки ЦИКЛ
ОбластьИтогДОП.Параметры.Итог=Тз.Итог(Колонка.Имя);
Табл.Присоединить(ОбластьИтогДОП);
КонецЦикла;
Табл.ТолькоПросмотр=истина;
Табл.Показать();
КонецПроцедуры
Категория:
Запросы Автоматическая выгрузка загрузка данных используя регламентное задание Для обмена данными между программами необходимо сделать следующее:
1. При помощи Конвертации Данных создать правила выгрузки данных
2. Нужно чтобы в конфигурации была обработка
УниверсальныйОбменДаннымиXML , желательно последней версии!
(При помощи ее и созданных правил будут выгрузаться и заружаться данные)
3. В 1-вой базе Добавляем Регламентное задание:
Имя - Выгрузка
Использование - !(галочка)
Расписание настройте обязательно.
Имя метода - Общий модуль в котором процедура ВыгрузимИзЗУП():
Код 1C v 8.х //Выгрузка кадровых данных
Процедура ВыгрузимИзЗУП() Экспорт
Обработина = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработина.РежимОбмена = "Выгрузка";
Обработина.ДатаНачала = НачалоДня(ДобавитьМесяц(ТекущаяДата(),-1));
Обработина.ДатаОкончания = КонецМесяца(ТекущаяДата());
Обработина.ИмяФайлаОбмена = "D:\ZUP_BUH_EXCH\Upload.xml";
Обработина.ИмяФайлаПравилОбмена = "D:\ZUP_BUH_EXCH\Zup-Buh.xml";
Обработина.ЗагрузитьПравилаОбмена();
Обработина.ВыполнитьВыгрузку();
КонецПроцедуры
4. Во 2-ой базе Добавляем Регламентное задание:
Имя - Загрузка
Использование - !(галочка)
Расписание настройте обязательно.
Имя метода - Общий модуль в котором процедура ЗагрузкаВБУХ():
Код 1C v 8.х Процедура ЗагрузкаВБУХ() Экспорт
Обработина = Обработки.УниверсальныйОбменДаннымиXML.Создать();
Обработина.ИмяФайлаОбмена = "D:\ZUP_BUH_EXCH\Upload.xml";
Обработина.РежимОбмена = "Загрузка";
Обработина.ОптимизированнаяЗаписьОбъектов = Истина;
Обработина.ЗаписыватьРегистрыНаборамиЗаписей = Истина;
Обработина.ЗаписыватьВИнформационнуюБазуТолькоИзмененныеОбъекты = Истина;
Обработина.ЗагружатьДанныеВРежимеОбмена = Истина;
Обработина.ВыполнитьЗагрузку();
КонецПроцедуры
Категория:
Конвертация данных, Обмен, Перенос Как получить количество ЛЕТ, МЕСЯЦЕВ, ДНЕЙ между датами? Нужно получить разницу между датами
31.12.2009 и
10.01.2005 и отобразить ее как:
4 года 11 месяцев 21 день
Код 1C v 8.х Процедура ТЕСТ_ВыполнитьНажатие(Кнопка)
ДатаНач = Дата(2009, 12, 31);
ДатаКон = Дата(2005, 1, 10);
Лет=0; Мес=0; Дн=0;
РазобратьРазностьДат(ДатаНач, ДатаКон, Лет, Мес, Дн);
ЛетС = ФормаМножественногоЧисла("год","года","лет",Лет);
МесС = ФормаМножественногоЧисла("месяц","месяца","месяцев",Мес);
ДнС = ФормаМножественногоЧисла("день","дня","дней",Дн);
Сообщить(?(Лет>0,Строка(Лет)+" "+ЛетС,"")+" "+?(Мес>0,Строка(Мес)+" "+МесС,"")+" "+Строка(дн)+" "+ДнС);
// Результат будет : 4 года 11 месяцев 21 день
КонецПроцедуры
// Получить разность дат
Процедура РазобратьРазностьДат(Дата1, Дата2, Лет = 0, Месяцев = 0, Дней = 0)
Лет = 0;
Месяцев = 0;
Дней = 0;
Если Дата1 > Дата2 Тогда
ВременнаяДата = Дата1;
Если День(ВременнаяДата) < День(Дата2) Тогда
Дней = (ВременнаяДата - ДобавитьМесяц(ВременнаяДата,-1))/86400;
ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-1);
КонецЕсли;
Если Месяц(ВременнаяДата) < Месяц(Дата2) Тогда
ВременнаяДата = ДобавитьМесяц(ВременнаяДата,-12);
Месяцев = 12;
КонецЕсли;
Лет = Макс( Год(ВременнаяДата) - Год(Дата2), 0);
Месяцев = Макс(Месяцев + Месяц(ВременнаяДата) - Месяц(Дата2), 0);
Дней = Макс(Дней + День(ВременнаяДата) - День(Дата2), 0);
// скорректируем отображаемое значение, если ""вмешалось"" разное количество дней в месяцах
Если Дата2 <> (ДобавитьМесяц(Дата1,-Лет * 12-Месяцев)-Дней * 86400) Тогда
Дней = Дней + (День(КонецМесяца(Дата2)) - День(НачалоМесяца(Дата2))) - (День(КонецМесяца(ДобавитьМесяц(Дата1,-1))) - День(НачалоМесяца(ДобавитьМесяц(Дата1,-1))));
КонецЕсли;
КонецЕсли;
КонецПроцедуры
// Сформировать множественное число
Функция ФормаМножественногоЧисла(Слово1, Слово2, Слово3, Знач ЦелоеЧисло)
// Изменим знак целого числа, иначе отрицательные числа будут неправильно преобразовываться
Если ЦелоеЧисло < 0 Тогда
ЦелоеЧисло = -1 * ЦелоеЧисло;
КонецЕсли;
Если ЦелоеЧисло <> Цел(ЦелоеЧисло) Тогда
// для нецелых чисел - всегда вторая форма
Возврат Слово2;
КонецЕсли;
// остаток
Остаток = ЦелоеЧисло%10;
Если (ЦелоеЧисло >10) И (ЦелоеЧисло<20) Тогда
// для второго десятка - всегда третья форма
Возврат Слово3;
ИначеЕсли Остаток=1 Тогда
Возврат Слово1;
ИначеЕсли (Остаток>1) И (Остаток<5) Тогда
Возврат Слово2;
Иначе
Возврат Слово3;
КонецЕсли;
КонецФункции
Категория:
Работа с Датами (Временем) Ввод записей в журнал расчетов Добавление записи в журнал расчетов:
Метод Новая может быть вызван где угодно, в глобальном модуле, модуле обработок, документов и т.д.
Данный метод проверяет корректность заполненных реквизитов журнала расчетов. При вводе новых записей журнала расчетов методами Новая и Записать обязательно должны быть заполнены следующие реквизиты записи журнала:
Объект, Документ, ВидРасч. Кроме того, проверяется корректность реквизитов
ДатаНачала и ДатаОкончания. Если реквизиты ДатаНачала и ДатаОкончания не установлены явным образом, при записи они устанавливаются как начало и окончание текущего расчетного прериода, соответственно. Реквизит ПериодРегистрации заполняется текущим значением расчетного периода, установленным для журнала расчетов (см. метод УстановитьПериодРасчета). Если реквизит
РодительскийДокумент не установлен явным образом, для него устанавливается то же значение, что и для реквизита Документ. Если реквизиты
Рассчитана, Сторно, Перерасчет, Фиксирована не установлены, то запись вводится как простая нерассчитанная, нефиксированная запись.
Внимание! При вводе новых записей в журнал расчетов методами Новая и Записать записи вводятся «как есть». Система не выполняет правила перерасчетов, а также правила взаимного вытеснения видов расчета. Ввод произвольных записей журнала расчетов очень ответственная операция. При использовании этих методов следует внимательно следить за логической целостностью журнала расчетов
Код 1C v 7.x Перем Док;
Перем Сотр;
Перем Рез;
// документы
Док = СоздатьОбъект("Документ");
// ...позиционируется нужный документ
// сотрудники
Сотр = СоздатьОбъект("Справочник.Сотрудники");
// ...позиционируется нужный элемент справочника сотрудники
// результат...
Рез = 555;
ЖР = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖР.Новая();
ЖР.УстановитьПериод(ЖР.ПолучитьпериордПоДате(ТекДата));
ЖР.УстановитьРеквизит("Документ", Док.ТекущийДокумент());
ЖР.УстановитьРеквизит("Объект", Сотр.ТекущийЭлемент());
ЖР.УстановитьРеквизит("ВидРасч", Вид Расчета.ПоОкладу);
ЖР.УстановитьРеквизит("Рассчитана", 1);
ЖР.УстановитьРеквизит("Результат", Рез);
ЖР.Записать();
Добавить записи в журнал расчетов которые вводятся при проведении документов:
Методы ВвестиРасчет и ЗаписатьРасчет могут быть вызваны только в модулях документов,
вводящих расчеты. Вызвать эти методы в модулях иных объектов, например
в модуле формы списка ЖЗ или в модуле отчета (обработки), нельзя.
Код 1C v 7.x // Ссылка на журнал расчетов
ЖЗ = СоздатьОбъект("ЖурналРасчетов.Зарплата");
ЖЗ.УстановитьРеквизит("Рассчитана",1);
ЖЗ.ВвестиРасчет(ВыбрСотрудник, ВидРасчета.Премия, НачалоМесяца, КонецМесяца, ПремияСотруднику);
или
Код 1C v 7.x ЖЗ.ЗаписатьРасчет(ВыбрСотрудник, ВидРасчета.Премия, НачалоМесяца, КонецМесяца, ПремияСотруднику);
Отличие метода
ЗаписатьРасчет заключается в том, что ввод вытесняющих расчетов приводит к вытеснению только тех расчетов, которые имеют меньший приоритет, а не меньший либо равный, как в случае с методом
ВвестиРасчет . Это приводит, в частности, к тому, что за счет применения этого метода расчет не вытесняет «сам себя».
При записи невытесняющего расчета ввод новых записей также происходит «осмотрительно» — новые записи вводятся только в том случае, если в журнале расчетов нет точно такой же записи. Под точно такой же записью здесь подразумевается запись с таким же видом расчета, для того же объекта и с тем же периодом действия.
Вывод: Для обновления самовытесняющего расчета при его повторном вводе другим документом
вместо метода ЗаписатьРасчет используется метод ВвестиРасчет. Категория:
Журналы расчетов Как программно открыть и выбрать документ, выбор документа из списка? Открыть список документов для выбора документа:
Код 1C v 8.х ФормаСписка = Документы.НачислениеЗарплатыРаботникамОрганизаций.ПолучитьФормуСписка();
ФормаСписка.Открыть();
Открыть список документов для выбора документа и установить отбор:
Код 1C v 8.х ФормаВыбора = Документы.НачислениеЗарплатыРаботникамОрганизаций.ПолучитьФормуВыбора();
//Это комментим, т.к. в данном случае будем отбирать по интервалу
//ФормаВыбора.ДокументСписок.Отбор.Дата.ВидСравнения=ВидСравнения.Равно;
//ФормаВыбора.ДокументСписок.Отбор.Дата.Значение=Дата;
ФормаВыбора.ДокументСписок.Отбор.Дата.ВидСравнения=ВидСравнения.ИнтервалВключаяОкончание;
ФормаВыбора.ДокументСписок.Отбор.Дата.ЗначениеС = НачалоМесяца(Дата);
ФормаВыбора.ДокументСписок.Отбор.Дата.ЗначениеПо = КонецМесяца(Дата);
ФормаВыбора.ДокументСписок.Отбор.Дата.установить();
ФормаВыбора.Заголовок = "Выберите документ";
ВыбДокНачисл = ФормаВыбора.ОткрытьМодально();
Категория:
Документы Функция ПредставлениеПериода() аналог 7-ной функции ПериодСтр() Функция позволяет формировать описание периода, заданного датами начала и окончания на одном из языков, поддерживаемых платформой. Например, в результате выполнения следующего кода:
Код 1C v 8.2 УП ТекДата = ТекущаяДата();
НачПериода = НачалоМесяца(ТекДата);
КонПериода = КонецМесяца(ТекДата);
Сообщение = Новый СообщениеПользователю;
Сообщение.Текст = ПредставлениеПериода(НачПериода, КонПериода, "L=en_US");
// или
Сообщение.Текст = ПредставлениеПериода(НачПериода, КонПериода, "L=ru_RU");
Сообщение.Сообщить();
будет получено представление периода на английском или русском языках!
Функция глобального контекста
ПредставлениеПериода() позволяет получить строковое представление периода, заданного датами начала и окончания.
Например:
Код 1C v 8.х ПредставлениеПериода('20050101000000', '20050101235959') // 1 января 2005 г.
ПредставлениеПериода('20050101000000', '20050131235959') // Январь 2005 г.
ПредставлениеПериода('20050101000000', '20050228235959') // Январь 2005 г. - Февраль 2005 г.
Кроме стандартных периодов эта функция позволяет получать представления так называемых финансовых периодов: первых девяти месяцев года и первого полугодия. Для этого используется форматная строка с указанием признака ФП:
Код 1C v 8.х ПредставлениеПериода('20050101000000', '20050630235959', "ФП = Истина") // 1 полугодие 2005 г.
ПредставлениеПериода('20050101000000', '20050930235959', "ФП = Истина") // 9 месяцев 2005 г.
Кроме этого форматная строка позволяет получать представление периода на языке, отличном от используемого по-умолчанию:
Код 1C v 8.х ПредставлениеПериода('20050101000000', '20050331235959', "L = en_US") // 1 quarter of 2005 - Английский
ПредставлениеПериода('20050101000000', '20050331235959', "L = bg_BG") // 1-во тримесечие на 2005 г. - Болгарский
ПредставлениеПериода('20050101000000', '20050331235959', "L = de_DE") // 1. Quartal 2005 - Немецкий
Категория:
Работа с Датами (Временем) Перебор дат, заполнение списка, массива дат по порядку Код 1C v 8.х // Укажем период
ДатаН = Дата(2008,1,1);
ДатаК = Дата(2009,12,31);
// В Список значений поместим перебором каждую дату за период
СписокДат = Новый СписокЗначений;
ТекДата = ДатаН;
Пока ТекДата < ДатаК Цикл
СписокДат.Добавить(ТекДата);
// Увеличение ровно на одни сутки
ТекДата = ТекДата + 60 * 60 * 24;
КонецЦикла;
СписокДат.Добавить(ТекДата);
//В Массив добавим каждый первый день месяца за период
МассивДат = Новый Массив;
ТекДата = ДатаН;
Пока ТекДата < ДатаК Цикл
МассивДат.Добавить(ТекДата);
// Для получения даты следющего месяца на Конец Дня,
// получаем дату конца месяца текущей даты и плюс одни сутки
//ТекДата = КонецМесяца(ТекДата) + 60 * 60 * 24;
// Для получения даты следющего месяца на Начало Дня,
// получаем дату конца месяца текущей даты и плюс один
ТекДата = КонецМесяца(ТекДата) + 1;
КонецЦикла;
Категория:
Работа с Датами (Временем) Как выбрать все записи регистра накопления за текущий месяц Код 1C v 8.х Выборка = РегистрыНакопления.ОстаткиМатериалов.Выбрать(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
Категория:
Регистры накопления Функция вычисляет даты начала/конца периодов за интервал в виде таблицы значений Код 1C v 8.х //Начало, Конец - начало и конец периода
//Периодичность - строка "День", "Месяц", "Неделя", "Год", "Квартал"
//Возвращает таблицу значений с колонками:
// Начало - начало интервала
// Конец - конец интервала
// Номер - номер интервала (начиная с единицы)
Функция обПериодыЗаИнтервал(Начало, Конец, Периодичность="День", ВыравниваниеПоПериоду=истина)
Перем Р, Номер, ТекПериод, СледПериод;
Р=Новый ТаблицаЗначений();
Р.Колонки.Добавить("Начало");
Р.Колонки.Добавить("Конец");
Р.Колонки.Добавить("Номер");
ТекПериод=Начало;
Номер=1;
Пока истина Цикл
Если Периодичность="День" Тогда
Если ВыравниваниеПоПериоду Тогда
ТекПериод=НачалоДня(ТекПериод);
СледПериод=КонецДня(ТекПериод);
Иначе
СледПериод=обДобавитьДни(ТекПериод, 1);
КонецЕсли;
ИначеЕсли Периодичность="Месяц" Тогда
Если ВыравниваниеПоПериоду Тогда
ТекПериод=НачалоМесяца(ТекПериод);
СледПериод=КонецМесяца(ТекПериод);
Иначе
СледПериод=обДобавитьМесяцы(ТекПериод, 1);
КонецЕсли;
ИначеЕсли Периодичность="Год" Тогда
Если ВыравниваниеПоПериоду Тогда
ТекПериод=НачалоГода(ТекПериод);
СледПериод=КонецГода(ТекПериод);
Иначе
СледПериод=обДобавитьМесяцы(ТекПериод, 12);
КонецЕсли;
ИначеЕсли Периодичность="Квартал" Тогда
Если ВыравниваниеПоПериоду Тогда
ТекПериод=НачалоКвартала(ТекПериод);
СледПериод=КонецКвартала(ТекПериод);
Иначе
СледПериод=обДобавитьМесяцы(ТекПериод, 3);
КонецЕсли;
ИначеЕсли Периодичность="Неделя" Тогда
Если ВыравниваниеПоПериоду Тогда
ТекПериод=НачалоНедели(ТекПериод);
СледПериод=КонецНедели(ТекПериод);
Иначе
СледПериод=обДобавитьДни(ТекПериод, 7);
КонецЕсли;
Иначе
ВызватьИсключение "Неизвестная периодичность времени:"+Периодичность;
КонецЕсли;
Если ТекПериод>Конец И НЕ Номер=1 Тогда
Прервать;
КонецЕсли;
Стр=Р.Добавить();
Стр.Начало=ТекПериод;
Стр.Конец=СледПериод;
Стр.Номер=Номер;
ТекПериод=СледПериод+1; //Переходим на следующий период (добавляем одну секунду)
Номер=Номер+1;
КонецЦикла;
Возврат Р;
КонецФункции
Категория:
Работа с Датами (Временем) Заполним диаграмму Ганта данными Код 1C v 8.х ДГ = ЭлементыФормы.ДГ;
// Установить заголовок диаграммы.
ДГ.ОбластьЗаголовка.Текст = "График дежурств";
// Интервал будем определять самостоятельно.
ДГ.АвтоОпределениеПолногоИнтервала = Ложь;
// Установить интервал.
ДГ.УстановитьПолныйИнтервал(НачалоМесяца(ТекущаяДата()), КонецМесяца(ТекущаяДата()));
// В диаграмме будет две точки - сотрудники Петров и Сидоров...
ТочкаП = ДГ.УстановитьТочку("Петров");
ТочкаС = ДГ.УстановитьТочку("Сидоров");
// и две серии - дежурство на вахте и дежурство в центральном офисе.
СерияНаВахте = ДГ.УстановитьСерию("На вахте");
СерияВЦентре = ДГ.УстановитьСерию("В центральном офисе");
// Задать цвета серий, отличные от цвета по умолчанию.
СерияНаВахте.Цвет = WebЦвета.Синий;
СерияВЦентре.Цвет = WebЦвета.СветлоЖелтый;
ПервыйДень = НачалоМесяца(ТекущаяДата());
// Получить значение диаграммы - дежурство Петрова на вахте.
Значение = ДГ.ПолучитьЗначение(ТочкаП, СерияНаВахте);
// В значении определить новый интервал.
Интервал = Значение.Добавить();
Интервал.Текст = "Работает на вахте";
// Определить границы интервала.
Интервал.Начало = ПервыйДень;
Интервал.Конец = ПервыйДень + 10 * 24 * 60 * 60;
// Получить значение диаграммы - дежурство Петрова в центральном офисе.
Значение = ДГ.ПолучитьЗначение(ТочкаП, СерияВЦентре);
Интервал = Значение.Добавить();
Интервал.Текст = "Работает в центральном офисе";
Интервал.Начало = ПервыйДень + 14 * 24 * 60 * 60;
Интервал.Конец = ПервыйДень + 24 * 24 * 60 * 60;
// Получить значение диаграммы - дежурство Сидорова на вахте.
Значение = ДГ.ПолучитьЗначение(ТочкаС, СерияНаВахте);
Интервал = Значение.Добавить();
Интервал.Текст = "Работает на вахте";
Интервал.Начало = ПервыйДень + 5 * 24 * 60 * 60;
Интервал.Конец = ПервыйДень + 15 * 24 * 60 * 60;
// Получить значение диаграммы - дежурство Сидорова в центральном офисе.
Значение = ДГ.ПолучитьЗначение(ТочкаС, СерияВЦентре);
Интервал = Значение.Добавить();
Интервал.Текст = "Работает в центральном офисе";
Интервал.Начало = ПервыйДень + 21 * 24 * 60 * 60;
Интервал.Конец = ПервыйДень + 25 * 24 * 60 * 60;
Категория:
Диаграмма