Как заполнить регистр накопления из регистров документа У меня есть регистр накопления и документ задачи. В регистре есть реквизит "автор" ссылка на "автор" в документе задача. Сделал движение указав Движение.Автор = Автор;
Когда добавляю автора в документ, провожу его, то а регистре накопления пустое поле, что делать?
Категория:
1С ERP Управление предприятием 2.0 Как удалить движения документа программно? Потребовалось в УТ быстро удалить все движения по банку, дело вроде легкое - отменить проведение всех поступлений и списаний безналичных денежных средств, но не тут то было...
При попытке отмены проведения выполнялись проверки на условия оплаты по заказу и документ ни как не отменял проведения
Ну не может типовым способом, заставим не типовым: Через запрос делаем выбору необходимых нам документов и в обработке результата пишем:
Код 1C v 8.3 Для Каждого СтрокаРезультата Из РезультатТаблица Цикл
//алгоритм обработки строки результата - начало
ДокОбъект = СтрокаРезультата.Ссылка.ПолучитьОбъект();
Для Каждого Движение ИЗ ДокОбъект.Движения Цикл
Если Движение.Количество() > 0 Тогда
Точка = Найти(Строка(Движение), ".");
ВидРегистра = Лев(Строка(Движение), Точка - 13);
РегистрИмя = СокрП(Сред(Строка(Движение), Точка + 1));
Если ВидРегистра = "РегистрНакопления" Тогда
НаборЗаписей = РегистрыНакопления[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрБухгалтерии" Тогда
НаборЗаписей = РегистрыБухгалтерии[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрСведений" Тогда
НаборЗаписей = РегистрыСведений[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрРасчета" Тогда
НаборЗаписей = РегистрыРасчета[РегистрИмя].СоздатьНаборЗаписей();
КонецЕсли;
НаборЗаписей.Отбор.Регистратор.Установить(ДокОбъект.Ссылка);
Иначе
НаборЗаписей = Движение;
КонецЕсли;
Попытка
НаборЗаписей.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
ДокОбъект.Проведен = Ложь;
//ДокОбъект.ОбменДанными.Загрузка = Истина;
ДокОбъект.Записать(режимзаписидокумента.запись);
//алгоритм обработки строки результата - конец
КонецЦикла;
Готовая функция для использования в своих обработках или общем модуле:
Код 1C v 8.3 Процедура УдалитьДвиженияДокумента(Документ)
ДокОбъект = Документ.ПолучитьОбъект();
Для Каждого Движение ИЗ ДокОбъект.Движения Цикл
Если Движение.Количество() > 0 Тогда
Точка = Найти(Строка(Движение), ".");
ВидРегистра = Лев(Строка(Движение), Точка - 13);
РегистрИмя = СокрП(Сред(Строка(Движение), Точка + 1));
Если ВидРегистра = "РегистрНакопления" Тогда
НаборЗаписей = РегистрыНакопления[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрБухгалтерии" Тогда
НаборЗаписей = РегистрыБухгалтерии[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрСведений" Тогда
НаборЗаписей = РегистрыСведений[РегистрИмя].СоздатьНаборЗаписей();
ИначеЕсли ВидРегистра = "РегистрРасчета" Тогда
НаборЗаписей = РегистрыРасчета[РегистрИмя].СоздатьНаборЗаписей();
КонецЕсли;
НаборЗаписей.Отбор.Регистратор.Установить(ДокОбъект.Ссылка);
Иначе
НаборЗаписей = Движение;
КонецЕсли;
Попытка
НаборЗаписей.Записать();
Исключение
Сообщить(ОписаниеОшибки());
КонецПопытки;
КонецЦикла;
КонецПроцедуры
Категория:
Документы Как установить параметр динамического списка? Когда используете для вывода данных динамический список и произвольный запрос, то бывают ситуации когда надо указать параметр используемый в этом запросе. Ниже пример вывода данных регистра сведений в карточке клиента
Для вывода используется используется запрос:
Код 1C v 8.3 ВЫБРАТЬ
РегистрСведенийFinans.Период,
РегистрСведенийFinans.Клиент,
РегистрСведенийFinans.Движение,
РегистрСведенийFinans.Расшифровка,
РегистрСведенийFinans.СуммаОбщая,
РегистрСведенийFinans.РасходыСервиса,
РегистрСведенийFinans.W1C
ИЗ
РегистрСведений.Finans КАК РегистрСведенийFinans
ГДЕ
РегистрСведенийFinans.Клиент =Клиент
Чтобы при открытии не отображалась информацию по другим клиентам, необходимо установить параметр динамического списка , сделаем это так:
Код 1C v 8.3 &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
Финансы.Параметры.УстановитьЗначениеПараметра("Клиент", Объект.Ссылка);
КонецПроцедуры
Можно и просто настроить отбор через настройки, используя ЭлементОтбораКомпоновкиДанных
Подробнее об этом: Динамический список ~ Как на управляемой форме разместить список регистра сведений с отбором?
Категория:
Работа с Формой (Диалог) и её элементами Как изменять записи регистра накопления? Основной шаблон такой:
Код 1C v 8.х Набор = РегистрыНакопления.ВашРегистр.СоздатьНаборЗаписей();
Набор.Отбор.<НазваниеОтбора>.Установить(<ЗначениеОтбора>);
Набор.Прочитать();
Для Каждого ТекДвижение Из Набор Цикл
//Делаете с записями регистра то - что вам хочется
КонецЦикла;
Набор.Записать();
Реальный пример:
Код 1C v 8.х Процедура МодификацияЗаписейРегистраНакопления()
ВыбДок = Документы.ПоступлениеТоваровУслуг.Выбрать();
Если ВыбДок.Следующий() Тогда
Набор = РегистрыНакопления.НДСПредъявленный.СоздатьНаборЗаписей();
Набор.Отбор.Регистратор.Установить(ВыбДок.Ссылка);
Набор.Прочитать();
// Изменение существующих записей
Для Каждого Движение Из Набор Цикл
Движение.НДС = 0;
КонецЦикла;
// Добавление новых записей, если вдруг необходимо
Движение = Набор.ДобавитьРасход();
Движение.Сумма = 100;
Движение.Период = ТекущаяДата();
Движение = Набор.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Сумма = 300;
Движение.Период = ТекущаяДата();
// удаление существующих записей если надо
Набор.Удалить(0);
Набор.Записать(Истина);
КонецЕсли;
КонецПроцедуры
Категория:
Регистры накопления Добавление в набор сторно-записей Если в рассчитываемом регистре установлено свойство Период действия, в сформированном наборе могут присутствовать записи, у которых период действия принадлежит более раннему периоду, чем период регистрации. В этом случае они могут вступать в конкуренцию на этом периоде действия с записями более раннего периода регистрации. Чтобы такие записи могли иметь непустой фактический период действия, необходимо допол- нить сформированный набор соответствующими сторно-записями.
Добавление сторно-записей происходит с использованием метода
ПолучитьДополнение() набора записей регистра. Ниже приведен текст модуля, позволяющий добавить в набор сторно-записи. Добавление записи происходит при помощи вызова процедуры
ДобавитьСтрокуСторноОсновныхНачислений() , которая должна быть описана в процедуре
РассчитатьОсновныеНачисления() . При этом для каждой сторно- записи необходимо добавить новую строку в табличную часть документа, чтобы при проведении эта запись попала в регистр
Код 1C v 8.х // Добавить сторно-записи в набор и в табличную часть.
Процедура ДобавитьСтрокуСторноОсновныхНачислений(ДанныеСтроки,
НаборЗаписей, ТабличнаяЧасть = Неопределено)
Движение = НаборЗаписей.Добавить();
// Предопределенные поля.
Движение.ПериодРегистрации = ДанныеСтроки.ПериодРегистрацииСторно;
Движение.ПериодДействияНачало = ДанныеСтроки.ПериодДействияНачалоСторно;
Движение.ПериодДействияКонец = ДанныеСтроки.ПериодДействияКонецСторно;
Движение.ВидРасчета = ДанныеСтроки.ВидРасчета;
Движение.Сторно = Истина;
// Измерения.
Движение.ФизЛицо = ДанныеСтроки.ФизЛицо;
Движение.Организация = ДанныеСтроки.Организация;
// Реквизиты.
Движение.ГрафикРаботы = ДанныеСтроки.ГрафикРаботы;
Движение.Размер = ДанныеСтроки.Размер;
Движение.ВидУчетаВремени = ДанныеСтроки.ВидУчетаВремени;
Движение.Подразделение = ДанныеСтроки.Подразделение;
Движение.СтатьяЗатрат = ДанныеСтроки.СтатьяЗатрат;
Если Не ТабличнаяЧасть = Неопределено Тогда
НоваяСтрока = ТабличнаяЧасть.Добавить();
НоваяСтрока.ФизЛицо = ДанныеСтроки.ФизЛицо;
НоваяСтрока.ВидРасчета = ДанныеСтроки.ВидРасчета;
НоваяСтрока.ДатаНачало = ДанныеСтроки.ПериодДействияНачалоСторно;
НоваяСтрока.ДатаКонец = ДанныеСтроки.ПериодДействияКонецСторно;
НоваяСтрока.Размер = ДанныеСтроки.Размер;
НоваяСтрока.Подразделение = ДанныеСтроки.Подразделение;
НоваяСтрока.Сторно = Истина;
КонецЕсли;
КонецПроцедуры // ДобавитьСтрокуСторноОсновныхНачислений
// Процедура расчета основных начислений.
Процедура РассчитатьОсновныеНачисления() Экспорт
НачатьТранзакцию();
// Сформировать набор записей.
// …
// Сформировать таблицу сторно-записей.
ТаблицаСторно = НаборОсновныеНачисления.ПолучитьДополнение();
// Добавить сторно-записи в набор.
Для Каждого СтрокаСторно из ТаблицаСторно Цикл
ДобавитьСтрокуСторноОсновныхНачислений(СтрокаСторно,
НаборОсновныеНачисления,
ОсновныеНачисления);
КонецЦикла;
// …
ЗафиксироватьТранзакцию();
КонецПроцедуры // РассчитатьОсновныеНачисления
При формировании сторно-записей данные всех измерений и реквизитов записи указаны в строке дополнения. Также в этой строке содержатся данные о периоде регистрации и периоде действия сторно-записи. Ресурсы сторно-записи не заполняются, так как запись будет рассчитана в общем порядке
Категория:
Регистры расчета Формирование записей регистра расчета Для формирования записей регистра расчета используется метод Добавить() объекта
РегистрРасчетаНаборЗаписей
Код 1C v 8.2 УП //Формирование записей регистра расчета
// Процедура добавляет запись в регистр основных начислений.
Процедура ДобавитьСтрокуОсновныхНачислений(ДанныеСтроки, НаборЗаписей)
Движение = НаборЗаписей.Добавить();
// Предопределенные поля.
Движение.ПериодРегистрации = ПериодРегистрации;
Движение.ПериодДействияНачало = ДанныеСтроки.ДатаНачало;
Движение.ПериодДействияКонец = ДанныеСтроки.ДатаКонец;
Движение.ВидРасчета = ДанныеСтроки.ВидРасчета;
Движение.Сторно = ДанныеСтроки.Сторно;
// Измерения.
Движение.ФизЛицо = ДанныеСтроки.ФизЛицо; Движение.Организация= Организация;
// Ресурсы.
Движение.Результат = ДанныеСтроки.Результат;
// Реквизиты.
Движение.ГрафикРаботы = ДанныеСтроки.ФизЛицо.ГрафикРаботы;
Движение.Размер = ДанныеСтроки.Размер;
Движение.ВидУчетаВремени = ДанныеСтроки.ВидРасчета.ВидУчетаВремени;
Движение.Подразделение = ДанныеСтроки.Подразделение;
Движение.СтатьяЗатрат = ДанныеСтроки.ВидРасчета.СтатьяЗатрат;
КонецПроцедуры // ДобавитьСтрокуОсновныхНачислений
// Обработка проведения.
Процедура ОбработкаПроведения(Отказ)
Движения.ОсновныеНачисленияРегл.Записывать = Истина; Движения.ДополнительныеНачисленияРегл.Записывать = Истина;
// Сформировать запрос по табличной части при помощи функции общего модуля. ВыборкаОсновныеНачисления = ОбщегоНазначения.
СформироватьЗапросПоТабличнойЧасти(ЭтотОбъект, "ОсновныеНачисления").Выбрать();
// По каждой строке табличной части сформировать запись в регистр. Пока ВыборкаОсновныеНачисления.Следующий() Цикл
ДобавитьСтрокуОсновныхНачислений(ВыборкаОсновныеНачисления, Движения.ОсновныеНачисленияРегл);
настройка алгоритмов расчета
КонецЦикла;
// Запись дополнительных начислений в регистр.
ВыборкаДополнительныеНачисления = ОбщегоНазначения.
СформироватьЗапросПоТабличнойЧасти(ЭтотОбъект, "ДополнительныеНачисления").Выбрать();
Пока ВыборкаДополнительныеНачисления.Следующий() Цикл
ДобавитьСтрокуДополнительныхНачислений(ВыборкаДополнительныеНачисления, Движения.ДополнительныеНачисленияРегл);
КонецЦикла;
КонецПроцедуры // ОбработкаПроведения
Категория:
Регистры расчета Проведение документа по регистру бухгалтерии Задача: Есть два склада Склад1 и Склад2. Нужно переместить определенное количество товара со склада1 на склад2. При списании со склада1 нужно проверять остаток, что хватает товара. Проведение сделать по регистру бухгалтерии.(проверку тоже по регистру бухгалтерии).
Решение: В Шапке документа Склад1 и Склад2. В Табличной части номенклатура и количество.
Код 1C v 8.х Процедура ОбработкаПроведения(Отказ, Режим)
Движения.Хозрасчетный.Очистить();
Движения.Хозрасчетный.Записать();
Движения.Хозрасчетный.Записывать = Истина;
Для Каждого ТекСтрокаТовары Из Товары Цикл
Запрос = Новый Запрос; //проверяем сколько осталось на складе1
Запрос.Текст = "ВЫБРАТЬ
| ХозрасчетныйОстатки.КоличествоОстатокДт
|ИЗ
| РегистрБухгалтерии.Хозрасчетный.Остатки КАК ХозрасчетныйОстатки
|ГДЕ
| ХозрасчетныйОстатки.Счет = &Счет
| И ХозрасчетныйОстатки.Субконто1 = &Субконто1
| И ХозрасчетныйОстатки.Субконто2 = &Субконто2";
Запрос.УстановитьПараметр("Счет",ПланыСчетов.Хозрасчетный.ТоварыНаСкладах); //41.1
Запрос.УстановитьПараметр("Субконто1",ТекСтрокаТовары.Номенклатура);
Запрос.УстановитьПараметр("Субконто2",Склад1);
Выборка = Запрос.Выполнить().Выбрать();
Если Выборка.Следующий() Тогда
Если Выборка.КоличествоОстатокДт < ТекСтрокаТовары.Количество Тогда
Сообщить("На складе1 остака: " + СокрЛП(Выборка.КоличествоОстатокДт));
Отказ = Истина;
Возврат;
КонецЕсли;
Иначе
Сообщить("нет остатка на складе1");
Отказ = Истина;
Возврат;
КонецЕсли;
Движение = Движения.Хозрасчетный.Добавить();
Движение.СчетКт = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах; //Списываем
Движение.СчетДт = ПланыСчетов.Хозрасчетный.ТоварыНаСкладах; //приходуем
Движение.Период = Дата;
Движение.КоличествоКт = ТекСтрокаТовары.Количество;
Движение.ДатаЗаписи = Дата;
Движение.Содержание = "Перемещение";
БухгалтерскийУчет.УстановитьСубконто(Движение.СчетКт,Движение.СубконтоКт,
"Номенклатура",ТекСтрокаТовары.Номенклатура);
БухгалтерскийУчет.УстановитьСубконто(Движение.СчетКт,Движение.СубконтоКт,
"Склады",Склад1);
БухгалтерскийУчет.УстановитьСубконто(Движение.СчетДт,Движение.СубконтоДт,
"Номенклатура",ТекСтрокаТовары.Номенклатура);
БухгалтерскийУчет.УстановитьСубконто(Движение.СчетДт,Движение.СубконтоДт,
"Склады",Склад2);
//Или так
//Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура] = Номенклатура;
//Движение.СубконтоКт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады] = Склад1;
//Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Номенклатура] = Номенклатура;
//Движение.СубконтоДт[ПланыВидовХарактеристик.ВидыСубконтоХозрасчетные.Склады] = Склад2;
КонецЦикла;
КонецПроцедуры
Категория:
Регистры бухгалтерии Как добавить движение в регистр накопления Код 1C v 8.х НаборЗаписей = РегистрыНакопления.ОплаченоДней.СоздатьНаборЗаписей();
НаборЗаписей.Отбор.Регистратор.Установить(ЭтотОбъект.Ссылка);
Запись = НаборЗаписей.ДобавитьПриход();
Запись.Регистратор = ЭтотОбъект.Ссылка;
Запись.Сотрудник = Строка.сотрудник;
Запись.Год = Перечисления.Года.год2010;
Запись.Дней = Строка.ОплаченоДнейЧасов;
НаборЗаписей.Записать();
Код 1C v 8.х Процедура ОбработкаПроведения(Отказ, Режим)
// регистр ТоварыНаСкладах Приход
Движения.ТоварыНаСкладах.Записывать = Истина;
Движения.ТоварыНаСкладах.Очистить();
Для Каждого ТекСтрокаТовары Из Товары Цикл
Движение = Движения.ТоварыНаСкладах.Добавить();
Движение.ВидДвижения = ВидДвиженияНакопления.Приход;
Движение.Период = Дата;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.Количество = ТекСтрокаТовары.Количество;
КонецЦикла;
КонецПроцедуры
Категория:
Регистры накопления Отправка отчетов из 1С по электронной почте (E-Mail) Автоматическая генерация отчета "Анализ заказов поставщикам"
Отчет анализ заказов является штатным отчетом конфигурации 1С Управление производственным предприятием. Обработка для генерации отчета, рассматриваемая в данной статье, позволяет программно создать и настроить форму отчета, запустить его выполнение. Полученный результат сохраняется в файл Microsoft Excel (XLS, XLSX) и может быть отправлен по электронной почте.
Предлагаемое решение состоит из трех файлов: Скачивать файлы может только зарегистрированный пользователь!
service.vbs служит для запуска 1С предприятия и генерации отчета;
emailer.vbs - VBS скрипт предназначен для отправки результатов выполнения запроса отчета на указанный при настройке адрес электронной почты;
rep_email.epf - сама внешняя обработка для генерации отчета, выполняющая настройки отображаемых показателей, группировок строк и столбцов, установки требуемых отборов отчета, обеспечивает выполнение запроса и формирования табличного документа по макету отчета и сохранение сформированного отчета в XLS файл.
Запуск отчета выполняется посредством VBS файла (vbscript) при помощи "Назначенных заданий". VBS программа обеспечивает запуск приложения 1С, устанавливает соединение с сервером 1С и передает управление внешней обработке через экспортную функцию ReportNow(), размещенную в общем модуле обработки по генерации отчета. Пример VBS Script для выполнения внешней обработки 1С из командной строки:
Код VBS ' Установить соединение с сервером 1С
Set v81 = CreateObject("V81.Application")
res = v81.Connect("Srvr=Server1C;Ref = db1C;Usr=User1C;Pwd=Password1C")
' Передать управление внешней обработке по генерации Отчета Анализ Заказов
res = v81.ExternalDataProcessors.Create("C:\1C\Service\rep_email.epf").ThisObject.Report()
v81.Exit(false)
' Дать возможность 1С закрыть все открытые файлы и выгрузиться из памяти
WScript.Sleep(5000)
' Вызвать VBS скрипт отправки почты по E-Mail
Dim WshShell
Set WshShell = WScript.CreateObject("WScript.Shell")
WshShell.Run "C:\1C\ Service\emailer.vbs"
VBS E-Mail скрипт для отправки готового отчета в формате Excel создает новое электронное письмо на заданный адрес, в теле письма указывает пояснение к отчету, а в качестве вложения прикрепляет файл, создание и наполнение информацией которого была произведена при запуске service.vbs
Код VBS 'Отправить сообщение с помощью локальной службы SMTP
Const cdoSendUsingPickup = 1
'Отправить сообщение с помощью сети (SMTP через сеть)
Const cdoSendUsingPort = 2
Const cdoAnonymous = 0
Const cdoBasic = 1
Const cdoNTLM = 2
Set objMessage = CreateObject("CDO.Message")
' Тема сообщения и адрес отправителя
objMessage.Subject = "Ежедневный отчет Анализ заказов поставщикам"
objMessage.From = """Генератор отчетов"" "
' Получатели письма указываются через " ; "
objMessage.To = "email@domain.org; recv@domain.net; last@domain.ru"
' Содержимое тела письма.
objMessage.TextBody = "JSC AUTO SERVICE. Please find Orders reporting in attachment." & vbCRLF & _
"------------------------------------------" & vbCRLF & _
"Best regards, Auto report service" & vbCRLF & _
"Support line: it@domian.ru" & vbCRLF
' Добавляем файл - вложение для отправки отчета по EMail
objMessage.AddAttachment "C:\1C\Service\ЗаказыПоставщику.xls"
' Секция настроек SMTP сервера для отправки почты.
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
' Имя или IP адрес SMTP Server
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.domain.ru"
' Тип используемой авторизации, NONE, Basic (Base64 encoded), NTLM
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpauthenticate") = cdoBasic
' Авторизация на SMTP server
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendusername") = "report@domain.ru"
' Пароль SMTP server
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/sendpassword") = "youpassword"
' Порт SMTP Server port (обычно 25, но может быть и другим)
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
' Использование SSL для соединения (False или True)
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpusessl") = False
' Время ожидания соединения с почтовым сервером
objMessage.Configuration.Fields.Item("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 60
' Сохранить настройки CDO для отправки сообщения
objMessage.Configuration.Fields.Update
' Отправить созданное почтовое сообщение с вложением отчета в формате XLS по указанному адресу
objMessage.Send
Внешняя обработка по запуску отчета "Анализ заказов поставщику" состоит из двух процедур. Первая - "ReportNow() Экспорт" служит для определения входной точки передачи управления от VBS к 1С. Вторая - "ОткрытьОтчетПоИмени()" - выполняет действия по настройке критериев отбора отчета, группировке строк и столбцов, определению состава количественных показателей. Данный способ вызова отчетов стандартной конфигурации широко применяется в различных формах 1С, и по мере развития конфигурации может быть позаимствован как минимум из нескольких форм списка справочников (Контрагенты, Номенклатура и т.д.). Исходный код первой функции: >
Код 1C v 8.х Процедура ReportNow() Экспорт
// Вызывается из vbscript, выполняет работы с отчетом.
ОткрытьОтчетПоИмени("АнализЗаказовПоставщикам");
КонецПроцедуры
Сохранение отчета из 1С в Excel
Процедура формирования формы отчета принимает в качестве параметра название объекта метаданных конфигурации, в данном случае - "АнализЗаказовПоставщикам". Очевидно, что в зависимости от типа отчета процедура будет меняться пропорционально используемым реквизитам. В рассматриваемом примере добавляется отбор по контрагенту. Для своего ключевого поставщика заменить значение искомого наименования на нужное.
Код 1C v 8.х Процедура ОткрытьОтчетПоИмени(НазваниеОтчета) Экспорт
// получаем отчет и открываем форму
// для построения отчета по названию отчета
Отчет = Отчеты[НазваниеОтчета].Создать();
Форма = Отчет.ПолучитьФорму(, , );
Форма.Открыть();
// Выполнить настройку отчета по умолчанию
Отчет.УстановитьНачальныеНастройки();
// Добавить требуемый отбор по поставщику
ТекОтбор = Отчет.УниверсальныйОтчет.ПостроительОтчета.Отбор.ДоговорКонтрагентаВладелец;
ТекОтбор.Использование = Истина;
ТекОтбор.Значение = Справочники.Контрагенты.НайтиПоНаименованию("Поставщик");
ТекОтбор.ВидСравнения = ВидСравнения.Равно;
// Добавляем специфичное для нас измерение в отборе - например, "осталось отгрузить"
// в данном случае из отчета уйдут позиции, по которым все получено.
Отчет.УниверсальныйОтчет.ПостроительОтчета.Отбор.Добавить("ОсталосьОтгрузитьЕдиницОтчетов");
ТекОтбор1 = ОтчетОстатки.УниверсальныйОтчет.ПостроительОтчета.Отбор.ОсталосьОтгрузитьЕдиницОтчетов;
ТекОтбор1.Использование = Истина;
ТекОтбор1.Значение = 0;
ТекОтбор1.ВидСравнения = ВидСравнения.Больше;
// Состав отдельных ключевых показателей
// для каждого отчета можно посмотреть в конфигураторе
Отчет.СостояниеОтгрузкиПоЗаказу = истина;
Отчет.НеОтгружено = Истина;
Отчет.ОтгруженоЧастично = Истина;
// После завершения настроек нажмем программно кнопку "Сформировать"
Отчет.СформироватьОтчет(ФормаОтчета.ЭлементыФормы.ПолеТабличногоДокументаРезультат);
// Сформировать путь и имя файла для сохранения отчета
мПутьШаблон="C:\1C\Service";
мФайлШаблон="ЗаказыПоставщику.xls";
ИмяФайла = мПутьШаблон + "\" + мФайлШаблон;
// Полученные в отчете цифры и данные сохраним в файл Excel
Если Не ИмяФайла = Неопределено Тогда
Форма.ЭлементыФормы.ПолеТабличногоДокументаРезультат.СохранятьСвойстваОтображения = Истина;
Форма.ЭлементыФормы.ПолеТабличногоДокументаРезультат.Записать(ИмяФайла, ТипФайлаТабличногоДокумента.XLS97);
КонецЕсли;
// Закрыть форму отчета после завершения работы
ФормаОтчета.Закрыть();
КонецПроцедуры
Для того, чтобы отладить обработку в режиме 1С:Предприятие, запущенного из конфигуратора можно создать экранную форму обработки и разместить в ней следующую процедур автоматического запуска отлаживаемого отчета:
Код 1C v 8.х Процедура ПередОткрытием(Отказ, СтандартнаяОбработка)
Отказ = истина;
ОткрытьОтчетПоИмени("АнализЗаказовПоставщикам");
КонецПроцедуры
Надеемся, что успешная комбинация внешней обработки для запуска отчета по расписанию и vbscript поможет в автоматизации бизнеса вашего предприятия. Данная редакция настроек больше ориентирована на менеджера поставщика для вашей компании, что отслеживать взаимное
движение товаров и документов.
Источник
Руководство компании, хочет получать оперативную сводку продаж по фирме Категория:
Работа с Интернет, Почтой (Mail), FTP Чтение(СрезПоследних) и Запись Регистра Сведений подчиненного регистратору(Обработка проведения) Для чтения данных из регистра сведений необходимо создать новый отбор и воспользоваться методами СрезПервых или СрезПоследних или использовать запрос как показано в примере обработки далее. Пример кода иллюстрирует эти методы:
Код 1C v 8.х Отбор = Новый Структура("ТипЦен, Номенклатура");
Отбор.ТипЦен = ТипЦены; // Какой тип цены
Отбор.Номенклатура = Номенклатура; // Для какой номенклатуры
// Цена в регистре сведений до Рабочей даты включительно
Цена = РегистрыСведений.ЦеныНоменклатуры.СрезПоследних( РабочаяДата(), Отбор);
Для записи в подчиненный регистратору регистр сведений Цены номенклатуры 1С использует механизмы проведения, а именно процедуру
Обработка Проведения , которые можно сформировать в конфигураторе, используя помощник - конструктор движений:
Код 1C v 8.х Процедура Обработка Проведения(Отказ, Режим)
Для Каждого ТекСтрокаТовары Из Товары Цикл
// регистр Цены Номенклатуры
Движение = Движения.ЦеныНоменклатуры.Добавить();
Движение.Период = Дата;
Движение.ТипЦен = ТекСтрокаТовары.ТипЦен;
Движение.Номенклатура = ТекСтрокаТовары.Номенклатура;
Движение.ХарактеристикаНоменклатуры = ТекСтрокаТовары.ХарактеристикаНоменклатуры;
Движение.Валюта = ТекСтрокаТовары.Валюта;
Движение.Цена = ТекСтрокаТовары.Цена;
Движение.ЕдиницаИзмерения = ТекСтрокаТовары.ЕдиницаИзмерения;
Движение.ПроцентСкидкиНаценки = ТекСтрокаТовары.ПроцентСкидкиНаценки;
Движение.СпособРасчетаЦены = ТекСтрокаТовары.СпособРасчетаЦены;
КонецЦикла;
КонецПроцедуры
Категория:
Регистры сведений Как определяется период регистрации регистра расчета? Есть три варианта ответов:
1. автоматически в момент ввода информации в регистр из документа-регистратора
2. программно в момент ввода информации в регистр из документа-регистратора
3. вручную после ввода записи в регистр расчета
Считается, что
правильный ответ - 2 . Да, действительно, видим, что в модуле документа в обработке проведения есть строки:
Код 1C v 8.х Движение.ПериодРегистрации = Дата;
Движения.Записать();
Вместе с тем, Максим Радченко пишет в своей книге:
"Для указания факта принадлежности записи к какому-либо периоду регистр имеет служебный реквизит ПериодРегистрации типа Дата. При записи данных в регистр платформа всегда приводит значение этого реквизита к началу того периода, в который он попадает. Например, если в регистр расчета с периодичностью месяц записать данные, где ПериодРегистрации задан как 08.04.2004, то регистр сохранит эти данные со значением поля ПериодРегистрации 01.04.2004."
Получается, что период регистрации определяется в два этапа:
а) программно в модуле документа в момент ввода информации в регистр,
б) автоматически системой при записи данных в регистр.
Ответ 2 соответствует пункту а), но сказать, что он полностью правильный, нельзя, т.к. в нем не отражен пункт б).
Вместе с тем, и ответ 1 в его текущей формулировке тоже не подходит. Ответ 3 не подходит в принципе.
Категория:
Регистры расчета Получить движения документа по регистру накоплений Код 1C v 8.х НужныйДокумент = Документы.ПриходнаяНакладная.НайтиПоНомеру(4);
Движения = РегистрыНакопления.ОстаткиМатериалов.СоздатьНаборЗаписей();
Движения.Отбор.Регистратор.Значение = НужныйДокумент;
Движения.Прочитать();
Код 1C v 8.х НужныйДокумент = Документы.ПриходнаяНакладная.НайтиПоНомеру(4);
Движения = РегистрыНакопления.ОстаткиМатериалов.СоздатьНаборЗаписей();
Движения.Отбор.Регистратор.Значение = НужныйДокумент;
Движения.Прочитать();
Для Каждого ОчередноеДвижение Из Движения Цикл
// Алгоритм обработки движений
КонецЦикла;
Категория:
Регистры накопления Пример переноса данных из 1С 7.7 в 8.1 посредством XML файла Код 1C v 7.x xmldoc = CreateObject("Msxml2.DOMDocument");
xmlDoc.loadXML("<root/>");
nodeRoot = xmlDoc.documentElement;
расходы = xmlDoc.createElement("СправочникРасходы");
Спр = Создатьобъект("Справочник.Расходы");
Спр.ВыбратьЭлементы();
Пока Спр.ПолучитьЭлемент()=1 цикл
расход = xmlDoc.createElement("Расход");
расход.setAttribute("Код",Спр.Код);
расход.setAttribute("Наименование",Спр.Наименование);
расход.setAttribute("Родитель",Строка(Спр.Родитель));
расход.setAttribute("Цена",Строка(Спр.Цена.Получить(ТекущаяДата())));
расход.setAttribute("Количество",Строка(Спр.Количество));
расход.setAttribute("ЭтоГруппа",Строка(Спр.ЭтоГруппа()));
расходы.appendChild(расход);
КонецЦикла;
nodeRoot.appendChild(расходы);
ДвижениеСчетов = xmlDoc.createElement("ДвижениеСчетов");
рег = СоздатьОбъект("Регистр.Счет");
рег.ВыбратьДвижения();
Пока Рег.ПолучитьДвижение()=1 цикл
Движение = xmlDoc.createElement("Движение");
Движение.setAttribute("Приход",Строка(Рег.Приход));
Движение.setAttribute("Дата",Строка(Рег.ТекущийДокумент().ДатаДок));
Движение.setAttribute("Описатель",Строка(Рег.Описатель));
Движение.setAttribute("СтатьяРасходов",Строка(Рег.СтатьяРасходов));
Движение.setAttribute("СтатьяПоступлений",Строка(Рег.СтатьяПоступлений));
Движение.setAttribute("Кто",Строка(Рег.Кто));
Движение.setAttribute("Кому",Строка(Рег.Кому));
Движение.setAttribute("Остаток",Строка(Рег.Остаток));
Движение.setAttribute("Количество",Строка(Рег.Количество));
ДвижениеСчетов.appendChild(Движение);
КонецЦикла;
nodeRoot.appendChild(ДвижениеСчетов);
xmlDoc.save("C:\budjet.xml");
Код 1C v 8.х
Функция Кошель(Кош)
стр = ТП2.Найти(Кош,"Описатель");
Возврат Стр.Счет;
КонецФункции
Функция Вал(Кош)
стр = ТП2.Найти(Кош,"Описатель");
Возврат Стр.Валюта;
КонецФункции
Функция Дата1С(дат)
Возврат "20"+сред(дат,7,2)+сред(дат,4,2)+лев(дат,2);
КонецФункции
Процедура Загрузка(Элемент)
xmlDoc = Новый COMОбъект("MSXML2.DOMDocument");
xmlDoc.load("C:\budjet.xml");
nodeRoot = xmlDoc.documentElement;
Для каждого nod из nodeRoot.childNodes цикл
Если nod.nodeName = "СправочникРасходы" тогда
Сообщить("нашли СправочникРасходы");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Код");
ТЗ.Колонки.Добавить("Наименование");
ТЗ.Колонки.Добавить("Родитель");
ТЗ.Колонки.Добавить("Цена");
ТЗ.Колонки.Добавить("Количество");
ТЗ.Колонки.Добавить("ЭтоГруппа");
Для Каждого Расход из nod.childNodes Цикл
Строка = ТЗ.Добавить();
Строка.Код = Расход.getAttribute("Код");
Строка.Наименование = Расход.getAttribute("Наименование");
Строка.Родитель = Расход.getAttribute("Родитель");
Строка.Цена = Число(Расход.getAttribute("Цена"));
Строка.Количество = Число(Расход.getAttribute("Количество"));
Строка.ЭтоГруппа = ?(Расход.getAttribute("ЭтоГруппа")="1",True,Ложь);
КонецЦикла;
//ТЗ.ВыбратьСтроку();
Для Каждого Стр из ТЗ Цикл
Родитель = Справочники.СтатьиЗатрат.НайтиПоНаименованию(Стр.Родитель,истина);
Справ = Справочники.СтатьиЗатрат.НайтиПоНаименованию(Стр.Наименование,истина);
Если Справ = Справочники.СтатьиЗатрат.ПустаяСсылка() тогда
Если Стр.ЭтоГруппа тогда
Справ = Справочники.СтатьиЗатрат.СоздатьГруппу();
Справ.Код = Стр.Код;
Справ.Наименование = Стр.Наименование;
Справ.Родитель = Родитель;
Справ.Записать();
Иначе
Справ = Справочники.СтатьиЗатрат.СоздатьЭлемент();
Справ.Код = Стр.Код;
Справ.Наименование = Стр.Наименование;
Справ.Родитель = Родитель;
Справ.Цена = Стр.Цена;
Справ.Количество = Стр.Количество;
Справ.Записать();
КонецЕсли;
Иначе
КонецЕсли;
КонецЦикла;
ИначеЕсли nod.nodeName = "ДвижениеСчетов" тогда
Сообщить("нашли движения счетов");
ТЗ = Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("Приход");
ТЗ.Колонки.Добавить("Дата");
ТЗ.Колонки.Добавить("Описатель");
ТЗ.Колонки.Добавить("Статья");
ТЗ.Колонки.Добавить("Цена");
ТЗ.Колонки.Добавить("Количество");
Для каждого движ из nod.childNodes цикл
Строка = ТЗ.Добавить();
Строка.Приход = ?(движ.getAttribute("Приход")="1",True,Ложь);
Строка.Дата = Дата(Дата1С(движ.getAttribute("Дата")));
Строка.Описатель = движ.getAttribute("Описатель");
Строка.Статья = Справочники.СтатьиЗатрат.НайтиПоНаименованию(движ.getAttribute(?(Строка.Приход,"СтатьяПоступлений","СтатьяРасходов")),истина);
Строка.Цена = Число(движ.getAttribute("Остаток"));
Строка.Количество = Число(движ.getAttribute("Количество"));
КонецЦикла;
ТЗ.ВыбратьСтроку();
Доки = Новый ТаблицаЗначений;
Доки.Колонки.Добавить("Док");
Доки.Колонки.Добавить("Дата");
Доки.Колонки.Добавить("КошелекС");
Доки.Колонки.Добавить("КошелекНа");
Доки.Колонки.Добавить("Статья");
Доки.Колонки.Добавить("ВалютаС");
Доки.Колонки.Добавить("ВалютаНа");
Доки.Колонки.Добавить("ЦенаС");
Доки.Колонки.Добавить("ЦенаНа");
Доки.Колонки.Добавить("Количество");
УжеЕстьДок=Ложь;
док=0;
Для Каждого Стр Из ТЗ цикл
Если Стр.Приход Тогда
Если УжеЕстьДок тогда
Док.КошелекНа = Кошель(Стр.Описатель);
Док.ВалютаНа = Вал(Стр.Описатель);
Док.ЦенаНа = Стр.Цена;
Док.Количество = Стр.Количество;
Док.Статья = Стр.Статья;
УжеЕстьДок=Ложь;
Иначе
Док = Доки.Добавить();
Док.КошелекНа = Кошель(Стр.Описатель);
Док.ВалютаНа = Вал(Стр.Описатель);
Док.ЦенаНа = Стр.Цена;
Док.Количество = Стр.Количество;
Док.Статья = Стр.Статья;
Док.Док = "ПоступлениеСредств";
КонецЕсли;
Иначе
Док = Доки.Добавить();
Док.КошелекС = Кошель(Стр.Описатель);
Док.ВалютаС = Вал(Стр.Описатель);
Док.ЦенаС = Стр.Цена;
Док.Количество = Стр.Количество;
Док.Статья = Стр.Статья;
Если СокрЛП(Стр.Статья.Наименование)="Обмен валюты" тогда
Док.Док = "ОбменВалюты";
УжеЕстьДок=истина;
ИначеЕсли СокрЛП(Стр.Статья.Наименование)="Перевод средств" тогда
Док.Док = "ПереводСредств";
УжеЕстьДок=истина;
Иначе
Док.Док = "РасходСредств";
УжеЕстьДок=Ложь;
КонецЕсли;
КонецЕсли;
Док.Дата = Стр.Дата;
КонецЦикла;
Доки.ВыбратьСтроку();
КонецЕсли;
КонецЦикла;
Для Каждого Док из Доки Цикл
Если Док.Док = "ПоступлениеСредств" тогда
Докум = Документы.ПоступлениеСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.Кошелек = Док.КошелекНа;
Докум.Валюта = Док.ВалютаНа;
Докум.Сумма = Док.ЦенаНа;
Докум.Статья = Док.Статья;
Докум.Записать(РежимЗаписиДокумента.Проведение);
ИначеЕсли Док.Док = "ПереводСредств" тогда
Докум = Документы.ПеремещениеСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.КошелекКуда = Док.КошелекНа;
Докум.КошелекОтКуда = Док.КошелекС;
Докум.Валюта = Док.ВалютаНа;
Докум.Сумма = Док.ЦенаНа;
Докум.Записать(РежимЗаписиДокумента.Проведение);
ИначеЕсли Док.Док = "ОбменВалюты" тогда
Докум = Документы.ПеремещениеСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.КошелекКуда = Док.КошелекНа;
Докум.КошелекОтКуда = Док.КошелекС;
Докум.Валюта = Док.ВалютаС;
Докум.Сумма = Док.ЦенаС;
Докум.Записать(РежимЗаписиДокумента.Проведение);
Докум = Документы.ОбменВалюты.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.Кошелек = Док.КошелекНа;
Докум.ВалютаС = Док.ВалютаС;
Докум.ВалютаНа = Док.ВалютаНа;
Докум.СуммаС = Док.ЦенаС;
Докум.СуммаНа = Док.ЦенаНа;
Докум.Курс = Докум.СуммаС / Докум.СуммаНа;
Докум.Переключатель = 1;
Докум.Записать(РежимЗаписиДокумента.Проведение);
Иначе
Докум = Документы.РасходСредств.СоздатьДокумент();
Докум.Дата = Док.Дата;
Докум.Кошелек = Док.КошелекС;
Докум.Валюта = Док.ВалютаС;
тч = Докум.Затраты.Добавить();
тч.Сумма = Док.ЦенаС;
тч.Статья = Док.Статья;
тч.Цена = Док.ЦенаС;
тч.Количество = Док.Количество;
Докум.Записать(РежимЗаписиДокумента.Проведение);
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Процедура ЗаполнитьТЗДанными(Элемент)
xmlDoc = Новый COMОбъект("MSXML2.DOMDocument");
xmlDoc.load("C:\budjet.xml");
nodeRoot = xmlDoc.documentElement;
Для каждого nod из nodeRoot.childNodes цикл
Если nod.nodeName = "ДвижениеСчетов" тогда
Сообщить("нашли движения счетов");
ТП1 = Новый ТаблицаЗначений;
ТП1.Колонки.Добавить("Описатель");
Типы = Новый Массив(1); Типы[0] = Тип("СправочникСсылка.Кошельки");
Тип = Новый ОписаниеТипов(Типы);
ТП1.Колонки.Добавить("Счет",Тип);
Типы[0] = Тип("СправочникСсылка.Валюты");
Тип = Новый ОписаниеТипов(Типы);
ТП1.Колонки.Добавить("Валюта",Тип);
Для каждого движ из nod.childNodes цикл
Описатель = движ.getAttribute("Описатель");
если ТП1.Найти(Описатель,"Описатель") = Неопределено тогда
стр = ТП1.Добавить();
Стр.Описатель = Описатель;
КонецЕсли;
КонецЦикла;
ТП2=ТП1;//ВыбратьСтроку();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
Категория:
XML, DBF, TXT, CSV Выбрать все движения регистра по датам в заданном интервале дат Выбрать все движения регистра по датам в заданном интервале дат
Код 1C v 7.x рег=создатьобъект("Регистр.Обороты");
рег.ВыбратьДвижения(НачМесяца(ТекущаяДата()));
Пока рег.ПолучитьДвижение()=1 Цикл
Сообщить("Товар="+строка(рег.Товар)+
" склад="+строка(рег.Склад)+
" контрагент="+строка(рег.Контрагент)+
" кол-во="+рег.Количество +
" сумма="+рег.Сумма);
КонецЦикла;
Категория:
Регистры Выбрать все движения регистра с остатками Метод ВыбратьДвиженияСОстатками инициирует выбор всех движении регистра в указанном интервале дат. Если <КонецВыборки> не указан или равен 0, то конном временного интервала выбора движений регистра считается ТА.
Данный метод отличается от метода ВыбратьДвижения тем, что после получения очередного движения метод Остаток будет выдавать актуальные значения остатков для этого регистра.
Код 1C v 7.x
Рег = СоздатьОбъект("Регистр.Взаиморасчеты");
Рег.ВременныйРасчет();
Рег.УстановитьФильтр(Клиент, );
РассчитатьРегистрыНа(ДатаНачала);
Рег.ВыбратьДвиженияСОстатками(ДатаКонца);
Пока Рег.ПолучитьДвижение() = 1 Цикл
Прих = 0;
Расх = 0;
Если Рег.Приход = 1 Тогда
Прих = Рег.Долг;
Иначе
Расх = Рег.Долг;
КонецЕсли;
ТекущееСальдо = Рег.Остаток(Клиент, "Задолженность");
Док = Рег.ТекущийДокумент();
Таб.ВывестиСекцию("Документ");
КонецЦикла;
Категория:
Регистры