Шаблон кода для вывода данных в табличный документ Часто при разработке необходимо вывести данные в печатную форму, ниже шаблон вывода в табличный документ
Пример процедуры Вывода на печать
Код 1C v 8.х Процедура Печать(ТабДок) Экспорт
//создание нового табличного документа
ТабДок = Новый ТабличныйДокумент;
//получение макета для печати расходной накладной
Макет = Документы.РасходнаяНакладная.ПолучитьМакет("Основной");
//получим область "Заголовок" как новый табличный документ (!)
Область = Макет.ПолучитьОбласть("Заголовок");
//укажем параметры области
Область.Параметры.НомерДокумента = Номер;
Область.Параметры.От = Дата;
Область.Параметры.Кому = Контрагент;
//выведем заполненную область "Заголовок" в табличный документ
ТабДок.Вывести(Область);
//выведем область "Шапка" в табличный документ
ТабДок.Вывести(Макет.ПолучитьОбласть("Шапка"));
//получение области "Строка"
//обратите внимание, что это можно сделать до цикла по строкам
Область = Макет.ПолучитьОбласть("Строка");
// вывод строк документа в печатную форму
Для Каждого СтрСостава Из Состав Цикл
//заполнение параметров области из строки табличной части
Область.Параметры.Заполнить(СтрСостава);
// вывод сформированной области в табличный документ
ТабДок.Вывести(Область);
КонецЦикла;
// вывод области "Подвал"
Область = Макет.ПолучитьОбласть("Подвал");
Область.Параметры.ИтогоКоличество = Состав.Итог("Количество");
Область.Параметры.ИтогоСумма = Состав.Итог("Сумма");
ТабДок.Вывести(Область);
//установим параметры отображения табличного документа
ТабДок.ТолькоПросмотр = Истина;
ТабДок.ОтображатьЗаголовки = Истина;
ТабДок.ОтображатьСетку = Ложь;
//покажем табличный документ на экране
ТабДок.Показать();
КонецПроцедуры<br>
Пример функции формирующей печатную форму Счета по Ссылке на документ:
Код 1C v 8.х Функция СформироватьПечатнуюФорму(СсылкаНаДокумент, ОбъектыПечати)
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент.ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СчетНаОплату";
МакетОбработки = ПолучитьМакет("Счет");
//заполняем шапку
ОбластьШапка = МакетОбработки.ПолучитьОбласть("Шапка");
ОбластьШапка.Параметры.НомерДокумента = СсылкаНаДокумент.Номер;
ОбластьШапка.Параметры.ДатаДокумента = СсылкаНаДокумент.Дата;
ОбластьШапка.Параметры.НазваниеОрганизации = СсылкаНаДокумент.Организация.Наименование;
//выводим шапку в табличный документ
ТабличныйДокумент.Вывести(ОбластьШапка);
//заполняем строки ТЧ
ОбластьСтроки = МакетОбработки.ПолучитьОбласть("СтрокаТЧ");
// Перебор строк документа
Для Каждого ТекущаяСтрока Из СсылкаНаДокумент.Товары Цикл
ЗаполнитьЗначенияСвойств(ОбластьСтроки.Параметры, ТекущаяСтрока);
ТабличныйДокумент.Вывести(ОбластьСтроки);
КонецЦикла;
//заполняем подвал
ОбластьПодвал = МакетОбработки.ПолучитьОбласть("Подвал");
ОбластьПодвал.Параметры.КоличествоИтог = СсылкаНаДокумент.Товары.Итог("Количество");
ОбластьПодвал.Параметры.СуммаИтог = СсылкаНаДокумент.Товары.Итог("Сумма");
ОбластьПодвал.Параметры.ИмяОтветственного = СсылкаНаДокумент.Менеджер.Наименование;
//выводим подвал в табличный документ
ТабличныйДокумент.Вывести(ОбластьПодвал);
// Установим настройки выводимого документа
ТабличныйДокумент.АвтоМасштаб = Истина;
Возврат ТабличныйДокумент;
КонецФункции
Категория:
Табличный документ Срез последних (остатки) на каждую дату Бывают ситуации, когда в запросе требуется получить остатки не на фиксированную дату (параметр - один на весь отчет), а на произвольную, (когда дата остатков в каждой строке своя).
Существует несколько способов получить нужные данные.
1.Непосредственно в запросе (через реальную таблицу регистра)
Способ подходит практически для любой ситуации, и поэтому наиболее универсален. Единственный, пожалуй, минус этого способа - если в отчете пользователю не требуется курс, то запрос быдет выбирать избыточные данные.
Вызов СрезПоследних() можно использовать только с передачей в него заранее готового значения даты, на которую требуется получить значения. Поэтому сабж делается через стыковку нескольких запросов - основной, к нему стыкуется запрос по регистру сведений с условием по дате и поиском записи с максимальной датой (периодом).
Код 1C v 8.х ВЫБРАТЬ
Таб1.СсылкаДок,
Таб1.ДатаДок,
Таб1.ВалютаДок,
Таб2.Курс
ИЗ
(ВЫБРАТЬ
ЗаказПокупателя.Ссылка КАК СсылкаДок,
ЗаказПокупателя.Дата КАК ДатаДок,
ЗаказПокупателя.ВалютаДокумента КАК ВалютаДок,
МАКСИМУМ(Валюты.Период) КАК ПериодДок
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Валюты
ПО Валюты.Период <= ЗаказПокупателя.Дата И
Валюты.Валюта = ЗаказПокупателя.ВалютаДокумента
СГРУППИРОВАТЬ ПО
ЗаказПокупателя.Ссылка) КАК Таб1
ЛЕВОЕ СОЕДИНЕНИЕ РегистрСведений.КурсыВалют КАК Таб2
ПО Таб1.ПериодДок = Таб2.Период И Таб1.ВалютаДок = Таб2.Валюта
Для общего развития:
Что есть срез последних в платформе?
Код 1C v 8.х ВЫБРАТЬ
Рег.Период,
Рег.Измерение,
Рег.Ресурс
ИЗ
РегситрСведений.ПериодическийРегистр.СрезПоследних(&Дата) КАК Рег
В зависимости от периодичности регистра (по времени, по позизии регистратора) ВТ разворачивается в следующий запрос:
1. По времени (год, месяц, ... секунда)
Код 1C v 8.х ВЫБРАТЬ
Таблица3.Ресурс,
Таблица3.Измерение,
Таблица3.Период
ИЗ
(ВЫБРАТЬ
Таблица1.Измерение КАК Измерение,
МАКСИМУМ(Таблица1.Период) КАК Период
ИЗ
РегистрСведений.ПериодическийРегистр КАК Таблица1
ГДЕ
Таблица1.Период <= &Дата
СГРУППИРОВАТЬ ПО
Таблица1.Измерение) КАК Таблица2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодическийРегистр КАК Таблица3
ПО Таблица2.Измерение= Таблица3.Измерение
И Таблица2.Период = Таблица3.Период
2. По позиции регистратора
В данном случае нужно еще раз обернуть выборку
Код 1C v 8.х ВЫБРАТЬ
Таблица5.Ресурс,
Таблица5.Измерение,
Таблица5.Период,
Таблица5.Регистратор
ИЗ
(ВЫБРАТЬ
МАКСИМУМ(Таблица3.Регистратор) КАК Регистратор,
Таблица3.Измерение
ИЗ
(ВЫБРАТЬ
Таблица1.Измерение КАК Измерение,
МАКСИМУМ(Таблица1.Период) КАК Период
ИЗ
РегистрСведений.ПериодическийРегистр КАК Таблица1
ГДЕ
Таблица1.Период <= &Дата
СГРУППИРОВАТЬ ПО
Таблица1.Измерение) КАК Таблица2
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодическийРегистр КАК Таблица3
ПО Таблица2.Измерение= Таблица3.Измерение
И Таблица2.Период = Таблица3.Период
СГРУППИРОВАТЬ ПО
Таблица3.Измерение) КАК Таблица4
ВНУТРЕННЕЕ СОЕДИНЕНИЕ РегистрСведений.ПериодическийРегистр КАК Таблица5
ПО Таблица4.Измерение = Таблица5.Измерение
И Таблица4.Регистратор = Таблица5.Регистратор
Все это можно увидеть посмотрев технологический журнал с включенным режимом протоколирования запросов
2.Система компоновки данных (передача набора значений одной таблицы в параметр виртуальной таблицы)
Данный способ подходит для отчетов. Из очевидных плюсов - если курс (или другие данные) не нужны для построения отчета, то СКД не будет их получать. Однако быстродействие такого отчета может оказаться и несколько ниже, чем в первом способе.
Для примера сделаем отчет - список заказов покупателей.
Для этого создадим набор данных "Документы" - запрос:
Код 1C v 8.х ВЫБРАТЬ
ЗаказПокупателя.Ссылка КАК ЗаказПокупателя,
ЗаказПокупателя.Дата КАК Дата,
ЗаказПокупателя.ВалютаДокумента КАК ВалютаДокумента,
ЗаказПокупателя.СуммаДокумента КАК СуммаДокумента
{ВЫБРАТЬ
ЗаказПокупателя.*,
Дата,
ВалютаДокумента.*,
СуммаДокумента}
ИЗ
Документ.ЗаказПокупателя КАК ЗаказПокупателя
{ГДЕ
ЗаказПокупателя.Ссылка.* КАК ЗаказПокупателя,
ЗаказПокупателя.СуммаДокумента}
Для того, чтобы потом успешно свзать наборы данных, в запрос необходимо включить поля "Дата" и "ВалютаДокумента". Чтобы они не появлялись в списке доступных полей, если это необходимо, их можно убрать, установив флажки ограничений в таблице "Поля" схемы компоновки. В остальном запрос вряд ли требует комментариев.
Для того, чтобы получить информацию о курсах валют, добавим второй набор данных-запрос, "Курсы валют":
Код 1C v 8.х ВЫБРАТЬ
&Дата КАК Дата,
КурсыВалютСрезПоследних.Валюта КАК Валюта,
КурсыВалютСрезПоследних.Курс КАК Курс,
КурсыВалютСрезПоследних.Кратность КАК Кратность
{ВЫБРАТЬ
Дата,
Валюта.*,
Курс,
Кратность}
ИЗ
РегистрСведений.КурсыВалют.СрезПоследних(&Дата, Валюта = &Валюта) КАК КурсыВалютСрезПоследних
{ГДЕ
КурсыВалютСрезПоследних.Курс,
КурсыВалютСрезПоследних.Кратность}
В этом запросе имеются 2 параметра: "Дата" и "Валюта". Эти параметры будут установлены СКД при соединении наборов. Кроме того, параметр "Дата" указан в выбранных полях - это нужно для соединения таблиц.
Для ненужный полей "Дата" и "Валюта" также устанавливаем флажки ограничений, чтобы они не появлялись в доступных полях.
Перейдем к соединению наборов. На странице "Связи наборов данных" добавим 2 связи:
1. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "Дата", выражение приемник - "Дата", Параметр - "Дата"
2. Источник связи - набор "Документы", приемник - набор "Курсы валют". Выражение источник - "ВалютаДокумента", выражение приемник - "Валюта", Параметр - "Валюта"
Главное здесь - параметры связи. При соединении наборов данных, если указан параметр, СКД передает в подчиненный набор (в нашем случае - запрос "Курсы валют") параметры, указанные в соединении. Значениями параметров будут значения соответствующих полей набора-источника.
Перейдем к вычисляемым полям. Добавим вычисляемое поле "СуммаВВалютеУпрУчета". Выражение поля - "СуммаДокумента * Курс / Кратность".
Также укажем поля "СуммаДокумента" и "СуммаВВалютеУпрУчета" как ресурсы
Настроим отчет.
Добавим одну группировку "Детальные записи", в выбранных полях укажем "ЗаказПолкупателя", "Курс" и "Кратность". Добавим ресурсы "СуммаДокумента" и "СуммаВВалютеУпрУчета"
Можно формировать отчет
Категория:
Регистры накопления Вывести табличный документ в PDF Данный пример работает на платформе выше 8.2.13
Код 1C v 8.х Макет = ПолучитьМакет("Макет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок = Новый ТабличныйДокумент;
ОбластьШапка.Параметры.НомерДок = Номер;
ОбластьШапка.Параметры.ДатаДок = Формат(Дата, "DDMMMMYYYY");
ОбластьШапка.Параметры.Руководитель = Руководитель;
ТабДок.Вывести(ОбластьШапка);
ТабДок.Защита=Истина;
ВремФайл=ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ВремФайл,ТипФайлаТабличногоДокумента.PDF);
ЗапуститьПриложение(ВремФайл);
Категория:
Табличный документ Как получить Временный каталог или Временный файл Временный каталог:
Код 1C v 8.х КаталогВременныхФайлов()
Получает имя каталога, который используется программой для размещения временных файлов.
Пример:
Код 1C v 8.х ГдеИскать = КаталогВременныхФайлов();
Код 1C v 8.2 УП // В тонком клиенте код работает
ИмяФайла = КаталогВременныхФайлов() + Элемент.ТекущиеДанные.ПредставлениеВложения;
Данные.Записать(ИмяФайла);
ЗапуститьПриложение(ИмяФайла);
!!! КаталогВременныхФайлов() недоступен на Веб-клиенте !!!
Это ограничение web-клиента. Вся работа с файловой системой в интерактивном режиме. Типа безопасность клиентской машины прежде всего
Временный файл:
Код 1C v 8.х ПолучитьИмяВременногоФайла(<Расширение> (необязательный)
Указывает желаемое расширение имени временного файла. Если параметр не задан, то создается временный файл с расширением по умолчанию (.tmp). Желаемое расширение задается строкой, которая и будет использована в качестве расширения. Указание точки в начале расширения не обязательно. Например, при указании ".xml" или "xml" результат будет одинаковый.
!!! Рекомендуется удалять временный файл самостоятельно после его использования. !!!
Пример:
Код 1C v 8.х Для каждого СтрокаТаблицы Из ТаблицаОтчетов Цикл
ИмяТемпФайла = ПолучитьИмяВременногоФайла();
СтрокаТаблицы.Отчет.Записать(ИмяТемпФайла,
ТипФайлаТабличногоДокумента.HTML);
ТекстHТМЛ = Новый ТекстовыйДокумент;
ТекстHТМЛ.Прочитать(ИмяТемпФайла);
ТекстHТМЛ = ТекстHТМЛ.ПолучитьТекст();
// ...
КонецЦикла;
Код 1C v 8.х Макет = ПолучитьМакет("Макет");
ОбластьШапка = Макет.ПолучитьОбласть("Шапка");
ТабДок = Новый ТабличныйДокумент;
ОбластьШапка.Параметры.НомерДок = Номер;
ОбластьШапка.Параметры.ДатаДок = Формат(Дата, "DDMMMMYYYY");
ОбластьШапка.Параметры.Руководитель = Руководитель;
ТабДок.Вывести(ОбластьШапка);
ТабДок.Защита=Истина;
ВремФайл=ПолучитьИмяВременногоФайла("pdf");
ТабДок.Записать(ВремФайл,ТипФайлаТабличногоДокумента.PDF);
ЗапуститьПриложение(ВремФайл);
Категория:
Работа с Файлами и Каталогами Удаление документа Код 1C v 8.2 УП &НаКлиенте
Процедура УдалитьДокумент(Команда)
// Вставить содержимое обработчика.
УдалитьДокументНаСервере(0);
КонецПроцедуры
&НаСервере
Процедура УдалитьДокументНаСервере(ПометкаУдаления)
// Вставить содержимое обработчика.
Перем УдаляемыйДокумент;
УдаляемыйДокумент =Документы.РасходнаяНакладная.НайтиПоНомеру("000000004");
Если ПометкаУдаления = 1 Тогда
УдаляемыйДокумент.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
Иначе
УдаляемыйДокумент.ПолучитьОбъект().Удалить();
КонецЕсли;
КонецПроцедуры
Код 1C v 8.х //Установить пометку удаления документа
ТС=ЭлементыФормы.Список.ТекущиеДанные;
ТД=Документы.РеализацияТоваровУслуг.НайтиПоНомеру(ТС.Номер, ТС.Дата);
Если ТД.Пустая() Тогда
Сообщить("Документ по номеру <такому то> не найден");
возврат;
КонецЕсли;
ТД.ПолучитьОбъект().УстановитьПометкуУдаления(Истина);
Код 1C v 8.х // Непосредственное удаление документов
Запрос = Новый Запрос("ВЫБРАТЬ
| Заказы.Ссылка
|ИЗ
| Документ.Заказы КАК Заказы
|ГДЕ
| Заказы.ПометкаУдаления = ИСТИНА");
Выборка = Запрос.Выполнить().Выбрать();
Пока Выборка.Следующий() Цикл
ОбъектДокумент = Выборка.Ссылка.ПолучитьОбъект();
ОбъектДокумент.Удалить();
КонецЦикла;
Код 1C v 7.x Д = СоздатьОбъект("Документ");
Д.ВыбратьДокументы(НачДата,КонДата);
Пока Д.ПолучитьДокумент() = 1 Цикл
Сообщить(Д.ТекущийДокумент());
Состояние(Д.ДатаДок);
Д.Удалить();
КонецЦикла;
Категория:
Документы Прямой SQL запрос к базе 7.7 из базы 8.x Код 1C v 8.х РабДата=Лев(СокрЛП(РабочаяДата),10);
//НачПрошлогоМесяца=Лев(СокрЛП(НачалоМесяца(ДобавитьМесяц(РабочаяДата, -1 ))),10);
НачПрошлогоМесяца=Лев(СокрЛП(НачалоМесяца(РабочаяДата)),10);
НачМесяца=Лев(СокрЛП(НачалоМесяца(РабочаяДата)),10);
МойЗапрос = "
|S_elect SC172.DESCR, RG38027.SP38025, _1SJOURN.DOCNO, LEFT(_1SJOURN.DATE_TIME_IDDOC, 8) AS DATADOC, SUM(RG38027.SP38026) AS Ost
|FROM RG38027, SC172, _1SJOURN, DH38011
|WHERE (RG38027.SP38024 = SC172.ID) AND (CONVERT (DATETIME , RG38027.PERIOD) = CONVERT (DATETIME , '"+НачПрошлогоМесяца+"')) AND
|(RG38027.SP38025 = _1SJOURN.IDDOC) AND (RG38027.SP38025 = DH38011.IDDOC)
|AND (DH38011.SP38005 = ' 3Z ')
|GROUP BY SC172.DESCR, RG38027.SP38025, _1SJOURN.DOCNO, _1SJOURN.DATE_TIME_IDDOC
|
|U_nion ALL
|
|S_elect SC172.DESCR, RA38027.SP38025, _1SJOURN.DOCNO, LEFT(_1SJOURN.DATE_TIME_IDDOC, 8) AS DATADOC, SUM(RA38027.SP38026*(1-2*RA38027.DEBKRED)) AS Ost
|FROM RA38027, SC172, _1SJOURN, DH38011
|WHERE (RA38027.SP38024 = SC172.ID) AND (RA38027.IDDOC=_1SJOURN.IDDOC) AND
|(CONVERT (DATETIME , LEFT(_1SJOURN.DATE_TIME_IDDOC,8)) <= CONVERT (DATETIME , '"+РабДата+"')) AND
|(CONVERT (DATETIME , LEFT(_1SJOURN.DATE_TIME_IDDOC,8)) > CONVERT (DATETIME , '"+НачМесяца+"')) AND
|(RA38027.SP38025 = _1SJOURN.IDDOC) AND (RA38027.SP38025 = DH38011.IDDOC)
|AND (DH38011.SP38005 = ' 3Z ')
|GROUP BY SC172.DESCR, RA38027.SP38025, _1SJOURN.DOCNO, _1SJOURN.DATE_TIME_IDDOC
|HAVING SUM(RA38027.SP38026*(1-2*RA38027.DEBKRED)) > 0
|ORDER BY SC172.DESCR";
Connection = Новый COMОбъект("ADODB.Connection");
//Connection.Provider = Провайдер;
Connection.ConnectionString = мдСтрокаПодключения;
//Сообщить(МойЗапрос);
Попытка
Connection.Open();
Исключение
Сообщить("Подключение - bad!");
КонецПопытки;
RS = Новый COMОбъект("ADODB.Recordset");
//RS.CursorType = 3;
RS.Open(МойЗапрос, Connection );
ТЗ=Новый ТаблицаЗначений;
ТЗ.Колонки.Добавить("КонтрагентНаименование", ПолучитьОписаниеТиповС(50),"Контрагент",30);
ТЗ.Колонки.Добавить("ИДДокумента", ПолучитьОписаниеТиповС(10));
ТЗ.Колонки.Добавить("НомерДок", ПолучитьОписаниеТиповС(10),"№ заявки",10);
ТЗ.Колонки.Добавить("ДатаДок", ПолучитьОписаниеТиповС(10),"дата заявки",10);
ТЗ.Колонки.Добавить("СуммаОстаток", ПолучитьОписаниеТиповЧ(10, 2),"Сумма",15);
Пока RS.EOF() = 0 Цикл
КонтрагентНаименование = RS.Fields("DESCR").Value;
ИДДокумента = RS.Fields("SP38025").Value;
НомерДок = RS.Fields("DOCNO").Value;
ДатаДок = RS.Fields("DATADOC").Value;
СуммаОстаток = Число(RS.Fields("Ost").Value);
Если СуммаОстаток = 0 Тогда
RS.MoveNext();
Продолжить;
КонецЕсли;
Стр=ТЗ.Добавить();
Стр.КонтрагентНаименование = КонтрагентНаименование;
Стр.ИДДокумента = ИДДокумента;
Стр.НомерДок = НомерДок;
Стр.ДатаДок = Дата(ДатаДок);
Стр.СуммаОстаток = СуммаОстаток;
RS.MoveNext();
КонецЦикла;
Категория:
COM-объекты, WMI, WSH Документ "Операция" - Как программно создать и заполнить? В бухгалтерских подсистемах типовых конфигураций есть всем известный документ «Операция». Бухгалтерам не приходится долго объяснять, как им пользоваться. Все по-бухгалтерски просто и лаконично: счет дебета, счет кредита, субконто, количество, сумма и прочие атрибуты бухгалтерских проводок. Проводки вводятся вручную, поэтому результат абсолютно прозрачен и понятен.
Время от времени возникает необходимость массово ввести большое количество проводок. Ситуации могут быть самыми разными: загрузка остатков или наоборот - списание с учета, исправление ошибок в учете и т. д. И тут уже дело за программистом.
На первый взгляд задача может показаться простой: создать документ, заполнить таблицу проводок данными и провести. Но не тут-то было! Как только дело доходит до «Конфигуратора», начинаются сюрпризы. Оказывается, у документа «Операция» вообще нет таблицы проводок, которую мы видим в пользовательском режиме.
Как же так? А вот так! Документ «Операция" используется в качестве регистратора, а проводки пишутся непосредственно в регистр бухгалтерии.
Решается задача довольно просто. Рассмотрим в качестве примера фрагмент кода обработки загрузки остатков по счету 001 «Арендованные основные средства» из dbf-таблицы.
Код 1C v 8.х
ДокОперация = Документы.ОперацияБух.СоздатьДокумент();
ДокОперация.Дата = ДатаДокумента;
ДокОперация.Организация = Организация;
ДокОперация.Ответственный = Ответственный;
ДокОперация.Содержание = Содержание;
ДокОперация.Комментарий = Комментарий;
ДокОперация.Записать();
ДокОперацияСсылка = ДокОперация.Ссылка;
РегХозрасчетный = РегистрыБухгалтерии.Хозрасчетный.СоздатьНаборЗаписей();
РегХозрасчетный.Отбор.Регистратор.Значение = ДокОперацияСсылка;
ДБФ.Первая();
Пока Не ДБФ.ВКонце() Цикл
КодКонтрагента = СокрП(ДБФ.CA);
Контрагент = Справочники.Контрагенты.НайтиПоКоду(КодКонтрагента);
Если Контрагент.Пустая() Тогда
Сообщить("Не найден контрагент с кодом " + КодКонтрагента, СтатусСообщения.Внимание);
КонецЕсли;
КодОС = СокрП(ДБФ.OS);
ОсновноеСредство = Справочники.ОсновныеСредства.НайтиПоКоду(КодОС);
Если ОсновноеСредство.Пустая() Тогда
Сообщить("Не найдено ОС с кодом " + КодОС, СтатусСообщения.Внимание);
КонецЕсли;
РегЗапись = РегХозрасчетный.Добавить();
РегЗапись.Период = ДатаДокумента;
РегЗапись.Регистратор = ДокОперацияСсылка;
РегЗапись.Организация = Организация;
РегЗапись.Содержание = "Корректировка стоимости ОС с 0 стоимостью";
РегЗапись.СчетДт = Сч001;
БухгалтерскийУчет.УстановитьСубконто(РегЗапись.СчетДт, РегЗапись.СубконтоДт, "Контрагенты", Контрагент);
БухгалтерскийУчет.УстановитьСубконто(РегЗапись.СчетДт, РегЗапись.СубконтоДт, "ОсновныеСредства", ОсновноеСредство);
РегЗапись.Сумма = ДБФ.Sum;
ДБФ.Следующая();
КонецЦикла;
РегХозрасчетный.Записать();
Я полагаю, принцип работы кода понятен из примера. Сначала создаем и записываем документ «Операция». Сам документ не содержит никаких проводок. Затем создаем набор записей регистра бухгалтерии и записываем в него проводки, используя документ «Операция» в качестве регистратора.
Источник Категория:
Документы Простое штрихкодирование документов Была поставлена задача на предприятии, где ежедневно выписывается по 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 // Дебиторская задолженность больше 0
И ДоговорВзаиморасчетов.ВедениеВзаиморасчетов = &ПоРасчетнымДокументам
И ДоговорВзаиморасчетов.КонтролироватьЧислоДнейЗадолженности
СГРУППИРОВАТЬ ПО ДоговорВзаиморасчетов) КАК ПерваяСделка
ПО Истина
ЛЕВОЕ СОЕДИНЕНИЕ // Для контроля суммы задолженности по расчетному документу
//(ведение взаиморасчетов - по расчетным документам)
РегистрНакопления.КонтрагентыВзаиморасчетыКомпании.Остатки(,
ДоговорВзаиморасчетов = &ДоговорВзаиморасчетов
И Сделка = &Сделка
) КАК ВзаиморасчетыПоСделке
ПО Истина
ЛЕВОЕ СОЕДИНЕНИЕ
РегистрНакопления.СуммыЗаказов.Обороты(,,, Заказ = &Сделка) КАК СуммыЗаказов
ПО Истина
ГДЕ
Док.Ссылка = &ДокументСсылка
ДЛЯ ИЗМЕНЕНИЯ РегистрНакопления.КонтрагентыВзаиморасчетыКомпании.Остатки
// Блокирующие чтение таблицы остатков регистра для разрешения
// коллизий многопользовательской работы
Категория:
Запросы Пример переноса данных из 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 Пример простой реализации OLE доступа из 8 к 77 Код 1C v 8.х V77 = Новый COMОбъект("V77M.Application");
Если V77.Initialize(V77.RMTrade,"ИсточникСтр","") Тогда
Сообщить("Успех");
Накл= V77.EvalExpr("CreateObject(""Документ.РасходнаяНакладная"")");
ДокОсн= V77.EvalExpr("CreateObject(""Документ"")");
Накл.ВыбратьДокументы();
Пока Накл.ПолучитьДокумент()=1 Цикл
Номер=СокрЛП(Накл.НомерДок);
ДокСоотв=Документы.РеализацияТоваров.НайтиПоНомеру(СокрЛП(Номер), Накл.ДатаДок);
Если Накл.Проведен()=0 Тогда
Продолжить;
КонецЕсли;
Если ДокСоотв=Документы.РеализацияТоваров.ПустаяСсылка() Тогда
Сообщить("! для "+Накл.Вид()+" "+Накл.НомерДок+" не найдено соответстствие");
Продолжить;
КонецЕсли;
Если Накл.ДокументОснование.Выбран()=0 Тогда
Продолжить;
КонецЕсли;
// и т.д.
Иначе Предупреждение("Ошибка открытия информационной базы");
Возврат;
КонецЕсли;
Категория:
COM-объекты, WMI, WSH Универсальная функция получения курса валюты Код 1C v 8.х Функция ПересчетСуммыПоКурсу(ВалютнаяСумма, Валюта, Дата) Экспорт
Запись = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата, Новый Структура("Валюта", Валюта));
Сумма = ВалютнаяСумма * Запись.Курс;
Если Запись.Кратность <> 0 Тогда
Сумма = Сумма / Запись.Кратность;
КонецЕсли;
Возврат Сумма;
КонецФункции
//Пример обращения
ВалютДол=Справочники.Валюты.НайтиПоНаименованию("USD");
ВалютнаяСумма=1000;
Сумм=ПересчетСуммыПоКурсу(ВалютнаяСумма, ВалютДол, ДатаДокумента);
Категория:
Полезные, Универсальные Функции Выборка документа по номеру и вывод на Печать, в Табличный Документ Код 1C v 7.x
Процедура Печать()
Если (ПустоеЗначение(ДатаНач)=1) или (ПустоеЗначение(ДатаКон)=1) Тогда
Предупреждение("Не задан период отчета");
Возврат;
КонецЕсли;
Заг="За период с "+ДатаНач+" по "+ДатаКон;
Таб=СоздатьОбъект("Таблица");
Таб.ВывестиСекцию("Шапка");
Док=СоздатьОбъект("Документ");
Док.ВыбратьДокументы(ДатаНач,ДатаКон);
ИтогоПриход=0;
ИтогоРасход=0;
Чеков=0;
//1C-ovec.ru Нужно выводить документы по Номеру, хотя лучше для этих целей использовать Запрос
ТЗврем = СоздатьОбъект("ТаблицаЗначений");
ТЗврем.НоваяКолонка("Док");
ТЗврем.НоваяКолонка("Дата");
ТЗврем.НоваяКолонка("Номер");
ТЗврем.НоваяКолонка("Приход");
ТЗврем.НоваяКолонка("Расход");
ТЗврем.НоваяКолонка("Чеков");
//Выборка документов
Пока Док.ПолучитьДокумент()=1 Цикл
Если Док.Проведен()=0 Тогда
Продолжить;
ИначеЕсли (Док.Вид()="ПриходныйОрдерТБ") и (флПКО=1) Тогда
Приход=Док.Сумма;
Расход=0;
ИначеЕсли (Док.Вид()="БезналичнаяОплата") и (флБН=1) Тогда
Приход=Док.Сумма;
Расход=0;
ИначеЕсли (Док.Вид()="РасходныйОрдерТБ") и (флРКО=1) Тогда
Приход=0;
Расход=Док.Сумма;
ИначеЕсли Док.Вид()="Чек" Тогда
Если (Док.Тип=1) и (флЧекиП=1) Тогда
Приход=Док.Сумма;
Расход=0;
Чеков=Чеков+1;
ИначеЕсли (Док.Тип=2) и (флЧекиВ=1) Тогда
Приход=0;
Расход=Док.Сумма;
Чеков=Чеков+1;
Иначе
Продолжить;
КонецЕсли;
Иначе
Продолжить;
КонецЕсли;
//Добавим в ТЗ строку
НовСТР=ТЗврем.НоваяСтрока();
ТЗврем.Док = Док;
ТЗврем.Дата = Док.ДатаДок;
ТЗврем.Номер = Док.НомерДок;
ТЗврем.Приход = Приход;
ТЗврем.Расход =Расход;
ТЗврем.Чеков = Чеков;
//Пока рано выводить
//Таб.ВывестиСекцию("Строка");
ИтогоПриход=ИтогоПриход+Приход;
ИтогоРасход=ИтогоРасход+Расход;
КонецЦикла;
//Теперь сортируем по номеру и выводим
ТЗврем.Сортировать("Номер");
ТЗврем.ВыбратьСтроки();
Пока ТЗврем.ПолучитьСтроку() = 1 Цикл
Док=ТЗврем.Док;
Приход=ТЗврем.Приход;
Расход=ТЗврем.Расход;
Таб.ВывестиСекцию("Строка");
КонецЦикла;
Таб.ВывестиСекцию("Итого");
Таб.ТолькоПросмотр(1);
Таб.Показать("Отчет по кассе");
КонецПроцедуры
Категория:
Документы Получить движения регистра Код 1C v 7.x // Пример 1
Рег1 = СоздатьОбъект("Регистр.Взаиморасчеты");
Если Режим = "Подробно" Тогда
Рег1.УстановитьФильтр(Клиент);
// Открываем выборку
Рег1.ВыбратьДвижения(ДатаНачало, );
// Цикл выбора движений по регистру
Пока Рег1.ПолучитьДвижение() > 0 Цикл
Если Строка(Рег1.Клиент.Код) <> Строка(Запрос.Клиент.Код) Тогда
Продолжить;
КонецЕсли;
Док = Рег1.ТекущийДокумент();
Дв_Баз_Сум = Рег1.СуммаБазовая;
Дв_Вал_Сум = Рег1.СуммаВалютная;
Если Рег1.Расход = 1 Тогда
Таб.ВывестиСекцию("Расход2");
Иначе
Таб.ВывестиСекцию("Приход2");
КонецЕсли;
КонецЦикла;
КонецЕсли;
//Пример 2
РегТовары = СоздатьОбъект("Регистр.Товары");
РегТовары.ВыбратьДвижения(ДатаНач, ДатаКон);
Пока РегТовары.ПолучитьДвижение()=1 Цикл
Сообщить("Дата движения " + Строка(РегТовары.ТекущийДокумент.ДатаДок));
Сообщить("Клиент: " + РегТовары.Клиент);
Сообщить("Товар: " + РегТовары.Товар);
Сообщить("Сумма: " + РегТовары.Доход);
КонецЦикла;
Категория:
Регистры Печать документа в Word используя шаблон doc.dot Код 1C v 7.x
Процедура ПечатьВWord()
wrd=создатьобъект("word.application");
wrd.documents.add("D:\doc.dot");
wrd.visible=1;
wrd.documents(1).tables(1).cell(1,2).range.text = НомерДок;
wrd.documents(1).tables(1).cell(1,4).range.text = ДатаДок;
wrd.documents(1).tables(1).cell(2,2).range.text = Склад.Наименование;
wrd.documents(1).tables(1).cell(3,2).range.text = Получатель.Наименование;
ВыбратьСтроки();
n=КоличествоСтрок() ;
Для i=1 по n-1 Цикл
wrd.documents(1).tables(2).rows.add(wrd.documents(1).tables(2).rows(2).range)
КонецЦикла;
стр = 2;
Пока ПолучитьСтроку()=1 Цикл
wrd.documents(1).tables(2).cell(стр,1).range.text = НомерСтроки;
wrd.documents(1).tables(2).cell(стр,2).range.text =Строка(Товар);
wrd.documents(1).tables(2).cell(стр,4).range.text =Строка(Цена);
wrd.documents(1).tables(2).cell(стр,3).range.text =Строка(Количество);
wrd.documents(1).tables(2).cell(стр,5).range.text =Строка(Сумма);
стр=стр+1;
КонецЦикла;
СуммаДокумента = Итог("Сумма");
wrd.documents(1).tables(2).cell(стр,5).range.text =Строка(СуммаДокумента);
КонецПроцедуры
Категория:
Работа с Microsoft Office и OpenOffice