Как программно создать документ копированием? При доработке какого-либо процесса, бывает необходимо программно создать документ копированием по ссылке уже созданного в базе.
Код позволяющий создать документ копированием:
Код 1C v 8.х Процедура ДействияФормыДобавитьКопированием(Кнопка)
колдок = 5 ;
Если ВвестиЧисло( колдок, "Сколько создать?" ) Тогда
Для н= 1 по колдок Цикл
ДокументКопия = ЭтаФорма. ЭлементыФормы. Список. ТекущаяСтрока. Скопировать( ) ;
ДокументКопия. Дата = РабочаяДата;
ДокументКопия. Записать( ) ;
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры
Категория:
Документы Шаблон кода для вывода данных в табличный документ Часто при разработке необходимо вывести данные в печатную форму, ниже шаблон вывода в табличный документ
Пример процедуры Вывода на печать
Код 1C v 8.х Процедура Печать(ТабДок) Экспорт
ТабДок = Новый ТабличныйДокумент;
Макет = Документы. РасходнаяНакладная. ПолучитьМакет( "Основной" ) ;
Область = Макет. ПолучитьОбласть( "Заголовок" ) ;
Область. Параметры. НомерДокумента = Номер;
Область. Параметры. От = Дата;
Область. Параметры. Кому = Контрагент;
ТабДок. Вывести( Область) ;
ТабДок. Вывести( Макет. ПолучитьОбласть( "Шапка" ) ) ;
Область = Макет. ПолучитьОбласть( "Строка" ) ;
Для Каждого СтрСостава Из Состав Цикл
Область. Параметры. Заполнить( СтрСостава) ;
ТабДок. Вывести( Область) ;
КонецЦикла ;
Область = Макет. ПолучитьОбласть( "Подвал" ) ;
Область. Параметры. ИтогоКоличество = Состав. Итог( "Количество" ) ;
Область. Параметры. ИтогоСумма = Состав. Итог( "Сумма" ) ;
ТабДок. Вывести( Область) ;
ТабДок. ТолькоПросмотр = Истина ;
ТабДок. ОтображатьЗаголовки = Истина ;
ТабДок. ОтображатьСетку = Ложь ;
ТабДок. Показать( ) ;
КонецПроцедуры < br>
Пример функции формирующей печатную форму Счета по Ссылке на документ:
Код 1C v 8.х Функция СформироватьПечатнуюФорму(СсылкаНаДокумент, ОбъектыПечати)
ТабличныйДокумент = Новый ТабличныйДокумент;
ТабличныйДокумент. ИмяПараметровПечати = "ПАРАМЕТРЫ_ПЕЧАТИ_СчетНаОплату" ;
МакетОбработки = ПолучитьМакет( "Счет" ) ;
ОбластьШапка = МакетОбработки. ПолучитьОбласть( "Шапка" ) ;
ОбластьШапка. Параметры. НомерДокумента = СсылкаНаДокумент. Номер;
ОбластьШапка. Параметры. ДатаДокумента = СсылкаНаДокумент. Дата;
ОбластьШапка. Параметры. НазваниеОрганизации = СсылкаНаДокумент. Организация. Наименование;
ТабличныйДокумент. Вывести( ОбластьШапка) ;
ОбластьСтроки = МакетОбработки. ПолучитьОбласть( "СтрокаТЧ" ) ;
Для Каждого ТекущаяСтрока Из СсылкаНаДокумент. Товары Цикл
ЗаполнитьЗначенияСвойств( ОбластьСтроки. Параметры, ТекущаяСтрока) ;
ТабличныйДокумент. Вывести( ОбластьСтроки) ;
КонецЦикла ;
ОбластьПодвал = МакетОбработки. ПолучитьОбласть( "Подвал" ) ;
ОбластьПодвал. Параметры. КоличествоИтог = СсылкаНаДокумент. Товары. Итог( "Количество" ) ;
ОбластьПодвал. Параметры. СуммаИтог = СсылкаНаДокумент. Товары. Итог( "Сумма" ) ;
ОбластьПодвал. Параметры. ИмяОтветственного = СсылкаНаДокумент. Менеджер. Наименование;
ТабличныйДокумент. Вывести( ОбластьПодвал) ;
ТабличныйДокумент. АвтоМасштаб = Истина ;
Возврат ТабличныйДокумент;
КонецФункции
Категория:
Табличный документ Табличная часть ~ Как настроить отбор строк? Часто возникает задача показать только нужные строки в табличной части документа или справочника (или другого объекта). Для этого можно использовать замечательное свойство:
в обычном приложении параметр для ОтборСтрок - Отбор...
в управляемом приложении - ФиксированнаяСтруктура
ОтборСтрок , которое входит в расширение табличного поля, связанного с табличной частью.
Управляемые формы Код 1C v 8.3 СписокЗаказовНаФорме. ОтборСтрок = Новый ФиксированнаяСтруктура( "Клиент" , СписокЗаказовНаФорме. ТекущиеДанные. Клиент) ;
пример:
Код 1C v 8.3 СписокЗаказовНаФорме = ЭтаФорма. Элементы. СписокЗаказов;
ТекНомер = Неопределено ;
Для НомерСтроки = 0 По СписокЗаказов. Количество( ) - 1 Цикл
Сообщение = Новый СообщениеПользователю;
Если СписокЗаказовНаФорме. ПроверитьСтроку( НомерСтроки) Тогда
СписокЗаказовНаФорме. ТекущаяСтрока = НомерСтроки;
Если ТекНомер = Неопределено Тогда
Если ЗначениеЗаполнено( СписокЗаказовНаФорме. ТекущиеДанные. Машина) Тогда
ТекНомер = СписокЗаказовНаФорме. ТекущиеДанные. Машина;
Иначе
Сообщение = Новый СообщениеПользователю;
Сообщение. Текст = "Установите нужный номер автомобиля в первой строке списка" ;
Сообщение. Поле = "СписокЗаказов[" + НомерСтроки + "].Машина" ;
Сообщение. Сообщить( ) ;
СписокЗаказовНаФорме. ОтборСтрок = Новый ФиксированнаяСтруктура( "Клиент" , СписокЗаказовНаФорме. ТекущиеДанные. Клиент) ;
Возврат ;
КонецЕсли ;
Иначе
СписокЗаказовНаФорме. ТекущиеДанные. Машина = ТекНомер;
КонецЕсли ;
КонецЕсли ;
КонецЦикла ;
или такой динамический отбор
Код 1C v 8.3 ЭлементОтбора = Список. Отбор. Элементы. Добавить( Тип( "ЭлементОтбораКомпоновкиДанных" ) ) ;
ЭлементОтбора. ЛевоеЗначение = Новый ПолеКомпоновкиДанных( "ИмяПоляОтбора" ) ;
ЭлементОтбора. ВидСравнения = ВидСравненияКомпоновкиДанных. Равно;
ЭлементОтбора. Использование = Истина ;
ЭлементОтбора. РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных. Недоступный;
ЭлементОтбора. ПравоеЗначение = ЗначениеПоляОтбора;
&НаКлиенте
Процедура ОчиститьОтбор(Команда)
этаформа. Список. Отбор. Элементы. Очистить( ) ;
КонецПроцедуры
Обычные формы Использовать его очень просто:
Код 1C v 8.х
ЭлементыФормы. ИмяТабПоля. ОтборСтрок. Колонка1 . Установить( ЗначениеОтбора) ;
ЭлементыФормы. ИмяТабПоля. ОтборСтрок. Колонка1 . Установить( , Ложь ) ;
или 2-й вариант:
Код 1C v 8.х ЭлементыФормы. ИмяТабПоля. ОтборСтрок. Колонка1 . Использование = Истина ;
ЭлементыФормы. ИмяТабПоля. ОтборСтрок. Колонка1 . ВидСравнения = ВидСравнения. Равно;
ЭлементыФормы. ИмяТабПоля. ОтборСтрок. Колонка1 . Значение = ЗначениеОтбора;
А теперь конкретные примеры:
Код 1C v 8.х
ЭлементыФормы. тпТовары. ОтборСтрок. Цена. Установить( 100 ) ;
- - - - - - - -
ЭлементыФормы. тпТовары. ОтборСтрок. Валюта. Установить( ВалютаУпр) ;
ЭлементыФормы. тпТовары. ОтборСтрок. Цена. Установить( 200 ) ;
- - - - - - - -
ЭлементыФормы. тпТовары. ОтборСтрок. Цена. Использование = Истина ;
ЭлементыФормы. тпТовары. ОтборСтрок. Цена. ВидСравнения = ВидСравнения. БольшеИлиРавно;
ЭлементыФормы. тпТовары. ОтборСтрок. Цена. Значение = 100 ;
- - - - - - - -
ЭлементыФормы. тпТовары. ОтборСтрок. Цена. Использование = Истина ;
ЭлементыФормы. тпТовары. ОтборСтрок. Цена. ВидСравнения = ВидСравнения. Интервал;
ЭлементыФормы. тпТовары. ОтборСтрок. Цена. ЗначениеС = 100 ;
ЭлементыФормы. тпТовары. ОтборСтрок. Цена. ЗначениеПо = 200 ;
- - - - - - - -
ЭлементыФормы. тпТовары. ОтборСтрок. Товар. Использование = Истина ;
ЭлементыФормы. тпТовары. ОтборСтрок. Товар. ВидСравнения = ВидСравнения. ВСписке;
ЭлементыФормы. тпТовары. ОтборСтрок. Товар. Значение. Добавить( Товар1 ) ;
ЭлементыФормы. тпТовары. ОтборСтрок. Товар. Значение. Добавить( Товар2 ) ;
Подчиненные табличные части в 8.х
С помощью свойства ОтборСтрок можно реализовать подчиненные (связанные) табличные части. При смене текущей строки в первой табличной части вторая табличная часть показывает только связанную информаци. Например, таким образом можно реализовать работу с комплектами: 1-я таб. часть - комплекты, вторая - состав комплекта.
Во второй табличной части должна быть колонка - идентификационный признак, связывающий ее с первой табличной частью. Таких колонок может быть несколько (составной ключ);
В событии ПриАктивизацииСтроки для первого табличного поля пишем:
Код 1C v 8.х ЭлементыФормы. СоставКомплекта. ОтборСтрок. Комплект. Установить( Комплект) ;
При добавлении новой строки во вторую табличную часть, нужно следить за тем, чтобы идентификационная колонка была установлена.
Обращаю ваше внимание, что при таком отборе не используются индексы и для больших табличных частей возможно замедление работы.
Еще раз напомню, что ОтборСтрок входит в расширение табличного поля табличной части, т.е. табличное поле должно быть связано с табличной частью. Если же оно связано с динамическим списком типа СправочникСписок, то здесь нужно использовать свойство Отбор для объекта типа СправочникСписок.
Если понадобилось перебрать строки, вошедшие в отбор, то это можно сделать, только заново перебрав все строки и проверив условие отбора для каждой строки. Перебрать строки табличного поля, которые сейчас на экране - невозможно.
Категория:
Работа с Формой (Диалог) и её элементами Как открыть форму списка документов с отбором? Данный код позволяет открыть список документов с установленным отбором, также можно открыть список элементов справочника с нужным отбором
Код 1C v 8.2 УП Форма = ОткрытьФорму( "Документ.РасходнаяНакладная.Форма.ФормаСписка" ) ;
ОтборВладелец = Форма. Список. Отбор. Элементы. Добавить( Тип( "ЭлементОтбораКомпоновкиДанных" ) ) ;
ОтборВладелец. ВидСравнения = ВидСравненияКомпоновкиДанных. Равно;
ОтборВладелец. Использование = Истина ;
ОтборВладелец. ЛевоеЗначение = Новый ПолеКомпоновкиДанных( "Контрагент" ) ;
ОтборВладелец. ПравоеЗначение = Объект. Контрагент;
Для того, чтобы открыть форму списка с заранее установленным отбором используйте следующие способы:
Первый способ заключается в том, что при открытии формы можно задать параметр формы Отбор, и открыть форму списка с этим параметром.
Параметр Отбор представляет собой структуру. Имена элементов соответствуют именам полей, по которым производится отбор, а значения содержат значения отбора. Это параметр расширения управляемой формы динамического списка. То есть он существует у форм, основным реквизитом которых является реквизит типа ДинамическийСписок, например у форм списка и форм выбора.
Например, в следующем примере открывается список приходных накладных с отбором по полю Номер, равному 333.
Код 1C v 8.2 УП ЗначениеОтбора = Новый Структура( "Номер" , "333" ) ;
ПараметрыВыбора = Новый Структура( "Отбор" , ЗначениеОтбора) ;
ОткрытьФорму( "Документ.ПриходнаяНакладная.ФормаСписка" , ПараметрыВыбора) ;
Второй способ
Можно открыть форму списка без параметров:
Код 1C v 8.2 УП ОткрытьФорму( "Документ.ПриходнаяНакладная.ФормаСписка" ) ;
И затем, в обработчике события формы списка приходных накладных ПриСозданииНаСервере написать код, который создает отбор в динамическом списке, являющемся основным реквизитом формы:
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭлементОтбора = Список. Отбор. Элементы. Добавить( Тип( "ЭлементОтбораКомпоновкиДанных" ) ) ;
ЭлементОтбора. ЛевоеЗначение = Новый ПолеКомпоновкиДанных( "Номер" ) ;
ЭлементОтбора. ВидСравнения = ВидСравненияКомпоновкиДанных. Больше;
ЭлементОтбора. Использование = Истина ;
ЭлементОтбора. РежимОтображения = РежимОтображенияЭлементаНастройкиКомпоновкиДанных. Недоступный;
ЭлементОтбора. ПравоеЗначение = "000000001" ;
КонецПроцедуры
Преимущества данного метода в том, что ВидСравнения у отбора можно задавать не только Равно, как в первом случае, а и Больше, Меньше и т.п.
Но у такого способа есть и очень существенный недостаток: с этим отбором форма будет открываться всегда. Откуда бы ее ни вызвали. Поэтому такую форму не следует назначать основной. А если все же она основная - то перед установкой отбора необходимо предусмотреть какой-то анализ того, откуда открывается эта форма. Например, анализируя параметры формы.
Третий способ
И наконец, условие отбора можно поместить в произвольный запрос, выбирающий данные для динамического списка.
Например, нам нужно открыть список приходных накладных, в которых присутствует номенклатура, выделенная в списке номенклатуры.
Для этого в форме списка номенклатуры создадим команду и соответствующую ей кнопку Приходные накладные.
Обработчик выполнения этой команды заполним следующим образом:
Код 1C v 8.2 УП &НаКлиенте
Процедура ПриходныеНакладные(Команда)
ПараметрыВыбора = Новый Структура( "ФильтрПоТовару" , Элементы. Список. ТекущаяСтрока) ;
ОткрытьФорму( "Документ.ПриходнаяНакладная.ФормаСписка" , ПараметрыВыбора) ;
КонецПроцедуры
В этом обработчике мы открываем форму списка приходных накладных, передавая в параметр формы ФильтрПоТовару ссылку на текущий элемент в списке номенклатуры.
Затем создадим форму списка документов ПриходнаяНакладная и создадим параметр формы ФильтрПоТовару, который мы будем использовать для открытия формы с нужным отбором.
Теперь откроем палитру свойств основного реквизита формы Список. Установим флаг ПроизвольныйЗапрос и в строке Настройка списка нажмём Открыть.
В поле Запрос введём следующий текст запроса:
Код 1C v 8.2 УП ВЫБРАТЬ
ДокументПриходнаяНакладная. Номер,
ДокументПриходнаяНакладная. Дата
ИЗ
Документ. ПриходнаяНакладная КАК ДокументПриходнаяНакладная
ГДЕ
ДокументПриходнаяНакладная. Товары. Товар = &Товар
В запросе мы используем параметр Товар, в который и будет передаваться ссылка на текущую строку в списке номенклатуры, содержащуюся в параметре формы списка приходных накладных ФильтрПоТовару.
Для этого в обработчике события формы списка ПриСозданииНаСервере напишем код для установки значения параметра запроса Товар:
Код 1C v 8.2 УП &НаКлиенте
Процедура ПриОткрытии(Отказ)
Список. Параметры. УстановитьЗначениеПараметра( "Товар" , Параметры. ФильтрПоТовару) ;
КонецПроцедуры
Здесь Список.Параметры - это список параметров запроса динамического списка для реквизита Список. Значение параметра Товар устанавливается равным значению параметра формы ФильтрПоТовару.
В результате по нажатию кнопки Приходные накладные в форме списка номенклатуры мы будем получать список только тех приходных накладных, в которых присутствует номенклатура, выделенная в данный момент в списке номенклатуры.
Категория:
Документы Загрузка данных в 1С из PDF В данной статье описан пример реализации загрузки данных накладных из PDF файлов для одного крупного Ритейла...
И так у Нас есть несколько файлов в формате pdf, которые нам необходимо загрузить в 1С.
Чтение PDF файлов из 1С
Первым дело я стал искать, как напрямую можно прочитать данные из 1С в PDF файлах - было найдено много информации и вариантов решений, но к сожалению большинство из них не правильно работали с кодировкой В результате банальный текст вида Красный стул превращался в страшную кракозябру.
Далее после долгих поисков был найден конвертер PDF в TXT - pdf2txt
Поддержка командной строки:
PDF2TXT <input PDF file> [output TXT file] [-logfile] [-open] [-space] [-html] [-format] [-silent] [-blankline] [-summary] [-zoom <num>] [-?] [-h]
<input PDF file> : Open an existing PDF file to convert.
[output TXT file] : Write to TEXT file, the default is same filename of input PDF file.
[-first <page number>]: Specify the first page number.
[-last <page number>]: Specify the last page number.
[-logfile] : Write log to "C:\pdf2txt.log" file.
[-open] : Auto open the text file after it be created.
[-space] : Auto insert spaces into text file.
[-html] : Output to a HTML file, not a text file.
[-format] : Keep the page layout in the generated TXT file.
[-silent] : Disable error and warning messages.
[-blankline] : Auto delete blank line in the generated TXT file.
[-summary] : Get PDF document summary.
[-zoom <num>] : Set zoom ratio, the range is from 50 to 200.
[-unicode] : Create UTF-8 encoding text file.
Примеры:
Код Batch File (DOS, CMD, BAT) C:\>PDF2TXT C:\input.pdf
C:\>PDF2TXT C:\input.pdf -unicode
C:\>PDF2TXT C:\input.pdf -first 10 -last 12
C:\>PDF2TXT C:\input.pdf C:\output.txt
C:\>PDF2TXT C:\input.pdf -open -silent -logfile -zoom 150
C:\>PDF2TXT C:\input.pdf C:\output.txt -open -silent
C:\>PDF2TXT C:\*.pdf
C:\>PDF2TXT C:\*.pdf C:\*.txt
C:\>PDF2TXT C:\test\*.pdf C:\test\*.txt
В архиве (Скачать Вы можете из статьи по ссылке ) заготовка 1С обработки для частного случая, если она Вам подойдет - Хорошо
Если же нет, то Мы можем для Вас быстро доработать загрузку PDF в 1С !
Код на 1С для конфигурации УТ 10.3:
Код 1C v 8.х Функция РазложитьСтрокуВМассивПодстрок(Знач Стр, Разделитель = "," ) Экспорт
МассивСтрок = Новый Массив( ) ;
Если Разделитель = " " Тогда
Стр = СокрЛП( Стр) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
МассивСтрок. Добавить( Лев( Стр, Поз- 1 ) ) ;
Стр = СокрЛ( Сред( Стр, Поз) ) ;
КонецЦикла ;
Иначе
ДлинаРазделителя = СтрДлина( Разделитель) ;
Пока 1 = 1 Цикл
Поз = Найти( Стр, Разделитель) ;
Если Поз= 0 Тогда
МассивСтрок. Добавить( Стр) ;
Возврат МассивСтрок;
КонецЕсли ;
ТекЗнч = СокрЛП( Лев( Стр, Поз- 1 ) ) ;
Если ЗначениеЗаполнено( ТекЗнч) Тогда
МассивСтрок. Добавить( ТекЗнч) ;
КонецЕсли ;
Стр = Сред( Стр, Поз+ ДлинаРазделителя) ;
КонецЦикла ;
КонецЕсли ;
КонецФункции
Процедура КнопкаВыполнитьНажатие(Кнопка)
тч. Очистить( ) ;
НайденныеФайлы = НайтиФайлы( ПутьКPDF, "*.pdf" , ложь ) ;
Для каждого стр Из НайденныеФайлы Цикл
Нстр = ТЧ. Добавить( ) ;
Нстр. ФайлPDF = стр. Имя;
КонецЦикла ;
ЭтаФорма. Обновить( ) ;
Для каждого стр Из ТЧ Цикл
Попытка
pdf = СокрЛП( ПутьКPDF+ "\" + стр. ФайлPDF) ;
txt = СтрЗаменить( pdf, "pdf" , "txt" ) ;
Команд = ПутьКPDF2TXT+ "\pdf2txt.exe " + pdf+ " " + txt;
ЗапуститьПриложение( Команд, ПутьКPDF, Истина ) ;
стр. ФайлTXT = txt;
Исключение
стр. ФайлTXT = "!!!_ОШИБКА" ;
КонецПопытки ;
ЭлементыФормы. ТЧ. ТекущаяСтрока = стр;
ЭлементыФормы. ТЧ. ОбновитьСтроки( стр) ;
КонецЦикла ;
мТекущийПользователь = глЗначениеПеременной( "глТекущийПользователь" ) ;
мСкладПоУмолчанию = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновнойСклад" ) ;
мОсновноеПодразделение = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновноеПодразделение" ) ;
мОсновнаяВалютаВзаиморасчетов = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновнаяВалютаВзаиморасчетов" ) ;
мОсновноеВедениеВзаиморасчетовПоДоговорам = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновноеВедениеВзаиморасчетовПоДоговорам" ) ;
мВидНоменклатурыПоУмолчанию = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОсновнойВидНоменклатуры" ) ;
мОтражатьВРеглУчете = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОтражатьДокументыВУправленческомУчете" ) ;
мОтражатьВБухУчета = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОтражатьДокументыВБухгалтерскомУчете" ) ;
мОтражатьВНалУчете = УправлениеПользователями. ПолучитьЗначениеПоУмолчанию( мТекущийПользователь, "ОтражатьДокументыВНалоговомУчете" ) ;
Для каждого стр Из ТЧ Цикл
Состояние( "Загружаю: " + стр. ФайлTXT) ;
текдок= Новый ТекстовыйДокумент;
текдок. Прочитать( стр. ФайлTXT, "UTF-8" ) ;
ЗагрузкаТЧ= Ложь ;
ДокВозвратТоваровОтПокупателя = Документы. ВозвратТоваровОтПокупателя. СоздатьДокумент( ) ;
ДокВозвратТоваровОтПокупателя. Ответственный = мТекущийПользователь;
ДокВозвратТоваровОтПокупателя. Дата = ОбщегоНазначения. ПолучитьРабочуюДату( ) ;
ДокВозвратТоваровОтПокупателя. УстановитьНовыйНомер( ) ;
ДокВозвратТоваровОтПокупателя. ВидПоступления = Перечисления. ВидыПоступленияТоваров. НаСклад;
ДокВозвратТоваровОтПокупателя. СкладОрдер = Склад;
ДокВозвратТоваровОтПокупателя. Подразделение = мОсновноеПодразделение;
ДокВозвратТоваровОтПокупателя. ВалютаДокумента = Справочники. Валюты. НайтиПоКоду( "643" ) ;
ДокВозвратТоваровОтПокупателя. УчитыватьНДС = ИСТИНА ;
ДокВозвратТоваровОтПокупателя. СуммаВключаетНДС = ИСТИНА ;
Для Ном= 1 по текдок. КоличествоСтрок( ) цикл
ТСтр = текдок. ПолучитьСтроку( Ном) ;
ТекСтр = СокрЛП( ТСтр) ;
Если Найти( ТекСтр, "Всего по накладной" ) > 0 Тогда
ЗагрузкаТЧ= Ложь ;
Для Каждого СтрокаТабличнойЧасти Из ДокВозвратТоваровОтПокупателя. Товары Цикл
ОбработкаТабличныхЧастей. РассчитатьКоличествоМестТабЧасти( СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя) ;
ОбработкаТабличныхЧастей. РассчитатьСуммуТабЧасти( СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя) ;
ОбработкаТабличныхЧастей. РассчитатьСуммуНДСТабЧасти( СтрокаТабличнойЧасти, ДокВозвратТоваровОтПокупателя) ;
КонецЦикла ;
Попытка
ДокВозвратТоваровОтПокупателя. Записать( РежимЗаписиДокумента. Проведение) ;
Исключение
ДокВозвратТоваровОтПокупателя. Записать( РежимЗаписиДокумента. Запись) ;
КонецПопытки ;
стр. Документ = ДокВозвратТоваровОтПокупателя. Ссылка;
стр. Инфо = "Все ОК" ;
ЭлементыФормы. ТЧ. ТекущаяСтрока = стр;
ЭлементыФормы. ТЧ. ОбновитьСтроки( стр) ;
Прервать ;
КонецЕсли ;
Если ЗагрузкаТЧ Тогда
ТекСтр = СтрЗаменить( ТекСтр, "подложке " , "подложке" ) ;
ТекСтр = СтрЗаменить( ТекСтр, " " , "|" ) ;
СтрМ= РазложитьСтрокуВМассивПодстрок( ТекСтр, "|" ) ;
Если СтрМ. Количество( ) > 2 Тогда
Попытка
НоваяСтрока = ДокВозвратТоваровОтПокупателя. Товары. Добавить( ) ;
НоваяСтрока. Номенклатура = Справочники. Номенклатура. НайтиПоКоду( СтрМ[2 ]) ;
НоваяСтрока. ЕдиницаИзмерения = НоваяСтрока. Номенклатура. БазоваяЕдиницаИзмерения;
НоваяСтрока. Коэффициент = 1 ;
НоваяСтрока. Количество = Число( СтрМ[6 ]) ;
НоваяСтрока. Цена = Число( СтрМ[7 ]) ;
НоваяСтрока. Сумма = Число( СтрМ[8 ]) ;
НоваяСтрока. СуммаНДС = Число( СтрМ[11 ]) ;
НоваяСтрока. Качество = Справочники. Качество. Новый ;
Попытка
НоваяСтрока. СтавкаНДС = Перечисления. СтавкиНДС["НДС" + Лев( СокрЛП( СтрМ[9 ]) , 2 ) ];
Исключение
НоваяСтрока. СтавкаНДС = НоваяСтрока. Номенклатура. СтавкаНДС;
КонецПопытки ;
Исключение
Сообщить( "Не загружено: " + ТекСтр) ;
КонецПопытки ;
Иначе
Продолжить;
КонецЕсли ;
Иначе
КонецЕсли ;
Если Найти( ТекСтр, "Товарная накладная" ) > 0 Тогда
ТекСтр = СтрЗаменить( ТекСтр, " " , "|" ) ;
СтрМ= РазложитьСтрокуВМассивПодстрок( ТекСтр, "|" ) ;
Если СтрМ. Количество( ) > 1 Тогда
ДокВозвратТоваровОтПокупателя. НомерВходящегоДокументаЭлектронногоОбмена = СтрМ[1 ];
ТекДата = СтрМ[2 ];
ДокВозвратТоваровОтПокупателя. ДатаВходящегоДокументаЭлектронногоОбмена = Дата( Прав( ТекДата, 4 ) + Сред( ТекДата, 4 , 2 ) + Лев( ТекДата, 2 ) ) ;
КонецЕсли ;
КонецЕсли ;
Если Найти( ТекСтр, "Грузополучатель:" ) > 0 Тогда
ГдеИНН = Найти( ТекСтр, "ИНН" ) ;
Если ГдеИНН> 0 Тогда
ГдеИННвр= лев( ТекСтр, ГдеИНН+ 15 ) ;
текИНН = Прав( гдеИННвр, СтрДлина( ГдеИННвр) - ( ГдеИНН+ 3 ) ) ;
текИНН = СокрЛП( СтрЗаменить( текИНН, "." , "" ) ) ; текИНН = СокрЛП( СтрЗаменить( текИНН, "," , "" ) ) ;
ТекОрганизация = Справочники. Организации. НайтиПоРеквизиту( "ИНН" , текИНН) ;
Если ТекОрганизация= Справочники. Организации. ПустаяСсылка( ) Тогда
ДокВозвратТоваровОтПокупателя. Организация = Организация;
Иначе
ДокВозвратТоваровОтПокупателя. Организация = ТекОрганизация;
КонецЕсли ;
КонецЕсли ;
КонецЕсли ;
Если Найти( ТекСтр, "Поставщик:" ) > 0 Тогда
ГдеИНН = Найти( ТекСтр, "ИНН" ) ;
Если ГдеИНН> 0 Тогда
ГдеИННвр= лев( ТекСтр, ГдеИНН+ 15 ) ;
текИНН = Прав( гдеИННвр, СтрДлина( ГдеИННвр) - ( ГдеИНН+ 3 ) ) ;
текИНН = СокрЛП( СтрЗаменить( текИНН, "." , "" ) ) ; текИНН = СокрЛП( СтрЗаменить( текИНН, "," , "" ) ) ;
ТекПоставщик = Справочники. Контрагенты. НайтиПоРеквизиту( "ИНН" , текИНН) ;
ДокВозвратТоваровОтПокупателя. Контрагент = ТекПоставщик;
ДокВозвратТоваровОтПокупателя. ДоговорКонтрагента = ТекПоставщик. ОсновнойДоговорКонтрагента;
КонецЕсли ;
КонецЕсли ;
Если Найти( ТекСтр, "Плательщик:" ) > 0 Тогда
ГдеИНН = Найти( ТекСтр, "ИНН" ) ;
Если ГдеИНН> 0 Тогда
ГдеИННвр= лев( ТекСтр, ГдеИНН+ 15 ) ;
текИНН = Прав( гдеИННвр, СтрДлина( ГдеИННвр) - ( ГдеИНН+ 3 ) ) ;
текИНН = СокрЛП( СтрЗаменить( текИНН, "." , "" ) ) ; текИНН = СокрЛП( СтрЗаменить( текИНН, "," , "" ) ) ;
ТекПлательщик = Справочники. Контрагенты. НайтиПоРеквизиту( "ИНН" , текИНН) ;
КонецЕсли ;
КонецЕсли ;
Если текстр= "1 2 3 4 5 6 7 8 9 10 11 12 13 14 15" Тогда
ЗагрузкаТЧ= Истина ;
КонецЕсли ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Процедура ПутьКPDF2TXTОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
Режим = РежимДиалогаВыбораФайла. ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытия. Каталог = "" ;
ДиалогОткрытия. МножественныйВыбор = Ложь ;
ДиалогОткрытия. Заголовок = "Выберите каталог с PDF2TXT" ;
Если ДиалогОткрытия. Выбрать( ) Тогда
ПутьКPDF2TXT = ДиалогОткрытия. Каталог;
ПутьКPDF = ДиалогОткрытия. Каталог;
КонецЕсли ;
КонецПроцедуры
Процедура ПутьКPDFОткрытие(Элемент, СтандартнаяОбработка)
СтандартнаяОбработка = Ложь ;
Режим = РежимДиалогаВыбораФайла. ВыборКаталога;
ДиалогОткрытия = Новый ДиалогВыбораФайла( Режим) ;
ДиалогОткрытия. Каталог = "" ;
ДиалогОткрытия. МножественныйВыбор = Ложь ;
ДиалогОткрытия. Заголовок = "Выберите каталог с PDF2TXT" ;
Если ДиалогОткрытия. Выбрать( ) Тогда
ПутьКPDF = ДиалогОткрытия. Каталог;
КонецЕсли ;
КонецПроцедуры
Категория:
Загрузка данных в 1С Обход метаданных (полезные функции) При написании небольших автоматизированных тестов часто надо обойти всю конфигурацию и проверить, например, для всех форм какое-нибудь свойство. Это всё легко делается через свойство глобального контекста "Метаданные", но чтоб дорбаться до обхода реквизитов надо написать кучу вложенных циклов. При этом код становится слабочитаемым и слабомодифицируемым.
Ниже приведен небольшой модуль, который решает задачу легко и удобно. Создана специальная функция РазвернутьСтрокуОбходаМетаданных, которая может по строке типа "Метаданные.Справочники.*.Реквизиты.*" построить массив строк с перечислением всех реквизитов всех справочников. При помощи этой и нескольких других функций в экспортных функциях модуля реализованы вполне прикладные задачи - получение всех реквизитов, всех макетов, всех форм конфигурации и построение таблицы всех составных типов.
Код 1C v 8.х
Функция РазвернутьСтрокуОбходаМетаданных(СтрокаОбхода, ЗаменяемоеЗначение = "*" , ПредставлениеПоУмолчанию = "" )
Рез = Новый Массив;
ЧастиСтрокиОбхода = РазобратьСтрокуОбхода( СтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию) ;
Если ЧастиСтрокиОбхода = Неопределено тогда
Рез. Добавить( СтрокаОбхода) ;
Иначе
ОбъектКоллекции = Вычислить( ЧастиСтрокиОбхода. СтрокаКоллекции) ;
РазвернутаяКоллекция = РазвернутьКоллекциюВПредставления( ОбъектКоллекции, ЧастиСтрокиОбхода. СтрокаПредставление) ;
Для каждого ЭлементРазвернутойКоллекции Из РазвернутаяКоллекция Цикл
ТекущаяСтрокаОбхода = ЧастиСтрокиОбхода. СтрокаНачало + ЭлементРазвернутойКоллекции + ЧастиСтрокиОбхода. СтрокаКонец;
МассивЭлемента = РазвернутьСтрокуОбходаМетаданных( ТекущаяСтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию) ;
Для каждого ПримитивныйЭлементОбхода Из МассивЭлемента Цикл
Рез. Добавить( ПримитивныйЭлементОбхода) ;
КонецЦикла ;
КонецЦикла ;
КонецЕсли ;
Возврат Рез;
КонецФункции
Функция РазобратьСтрокуОбхода(СтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию)
Если ПустаяСтрока( ЗаменяемоеЗначение) Тогда
ВызватьИсключение "Некорректное выражение заменяемого значения" ;
КонецЕсли ;
ПозицияЗамены = Найти( СтрокаОбхода, ЗаменяемоеЗначение) ;
Если ПозицияЗамены = 0 Тогда
Возврат Неопределено ;
КонецЕсли ;
СтрокаНачало = Лев( СтрокаОбхода, ПозицияЗамены - 1 ) ;
СтрокаКоллекции = СтрокаНачало;
Если Прав( СтрокаКоллекции, 1 ) = "." Тогда
СтрокаКоллекции = Лев( СтрокаКоллекции, СтрДлина( СтрокаКоллекции) - 1 ) ;
КонецЕсли ;
ПозицияОкончанияЗамены = ПозицияЗамены + СтрДлина( ЗаменяемоеЗначение) ;
ОстатокВыражения = Сред( СтрокаОбхода, ПозицияОкончанияЗамены) ;
ОткрывающаяСкобка = "[" ;
ЗакрывающаяСкобка = "]" ;
Если Найти( ОстатокВыражения, ОткрывающаяСкобка) = 1 Тогда
ОстатокВыражения = Сред( ОстатокВыражения, СтрДлина( ОткрывающаяСкобка) + 1 ) ;
ПозицияЗакрывающейСкобки = Найти( ОстатокВыражения, ЗакрывающаяСкобка) ;
Если ПозицияЗакрывающейСкобки = 0 Тогда
ВызватьИсключение "Синтаксическая ошибка разбора выражения" ;
КонецЕсли ;
СтрокаПредставление = Лев( ОстатокВыражения, ПозицияЗакрывающейСкобки - 1 ) ;
ОстатокВыражения = Сред( ОстатокВыражения, ПозицияЗакрывающейСкобки + СтрДлина( ЗакрывающаяСкобка) ) ;
Иначе
СтрокаПредставление = ПредставлениеПоУмолчанию;
КонецЕсли ;
СтрокаКонец = ОстатокВыражения;
Рез = Новый Структура( "ПозицияЗамены, СтрокаНачало, СтрокаКоллекции, СтрокаПредставление, СтрокаКонец" ,
ПозицияЗамены, СтрокаНачало, СтрокаКоллекции, СтрокаПредставление, СтрокаКонец) ;
Возврат Рез;
КонецФункции
Функция РазвернутьКоллекциюВПредставления(Коллекция, Знач ПредставлениеЭлемента = "" )
Если не ПустаяСтрока( ПредставлениеЭлемента) Тогда
Если Найти( ПредставлениеЭлемента, ";" ) > 0 Тогда
ВызватьИсключение "Некорректное выражение представления" ;
КонецЕсли ;
ПредставлениеЭлемента = "." + ПредставлениеЭлемента;
КонецЕсли ;
Рез = Новый Массив;
Для каждого ЭлементКоллекции Из Коллекция Цикл
ТекПредставление = Строка( Вычислить( "ЭлементКоллекции" + ПредставлениеЭлемента) ) ;
Рез. Добавить( ТекПредставление) ;
КонецЦикла ;
Возврат Рез;
КонецФункции
Функция РазвернутьМассивСтрокОбходаМетаданных(МассивСтрокОбхода, ЗаменяемоеЗначение = "*" , ПредставлениеПоУмолчанию = "Имя" )
Рез = Новый Массив;
Для каждого СтрокаОбхода Из МассивСтрокОбхода Цикл
ДополнениеРезультата = РазвернутьСтрокуОбходаМетаданных( СтрокаОбхода, ЗаменяемоеЗначение, ПредставлениеПоУмолчанию) ;
Для каждого ТекСтрока Из ДополнениеРезультата Цикл
Рез. Добавить( ТекСтрока) ;
КонецЦикла ;
КонецЦикла ;
Возврат Рез;
КонецФункции
Функция ПолучитьМассивСтрокМногострочнойСтроки(ПреобразуемаяСтрока, ИгнорироватьПустые = Истина, СокращатьПробелы = Истина)
Рез = Новый Массив;
ЧислоСтрок = СтрЧислоСтрок( ПреобразуемаяСтрока) ;
Для Сч = 1 По ЧислоСтрок Цикл
ТекСтрока = СтрПолучитьСтроку( ПреобразуемаяСтрока, Сч) ;
Если ИгнорироватьПустые и ПустаяСтрока( ТекСтрока) Тогда
Продолжить;
КонецЕсли ;
Если СокращатьПробелы Тогда
ТекСтрока = СокрЛП( ТекСтрока) ;
КонецЕсли ;
Рез. Добавить( ТекСтрока) ;
КонецЦикла ;
Возврат Рез;
КонецФункции
Функция ПолучитьВсеХранимыеРеквизитыКонфигурации() Экспорт
СтрокаВсехРеквизитов =
"
|Метаданные.Константы.*
|Метаданные.ПланыОбмена.*.Реквизиты.*
|Метаданные.ПланыОбмена.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Справочники.*.Реквизиты.*
|Метаданные.Справочники.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Документы.*.Реквизиты.*
|Метаданные.Документы.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Последовательности.*.Измерения.*
|Метаданные.ПланыВидовХарактеристик.*.Реквизиты.*
|Метаданные.ПланыВидовХарактеристик.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.ПланыСчетов.*.Реквизиты.*
|Метаданные.ПланыСчетов.*.ПризнакиУчета.*
|Метаданные.ПланыСчетов.*.ПризнакиУчетаСубконто.*
|Метаданные.ПланыСчетов.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.ПланыВидовРасчета.*.Реквизиты.*
|Метаданные.ПланыВидовРасчета.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.РегистрыСведений.*.Измерения.*
|Метаданные.РегистрыСведений.*.Ресурсы.*
|Метаданные.РегистрыСведений.*.Реквизиты.*
|Метаданные.РегистрыНакопления.*.Измерения.*
|Метаданные.РегистрыНакопления.*.Ресурсы.*
|Метаданные.РегистрыНакопления.*.Реквизиты.*
|Метаданные.РегистрыБухгалтерии.*.Измерения.*
|Метаданные.РегистрыБухгалтерии.*.Ресурсы.*
|Метаданные.РегистрыБухгалтерии.*.Реквизиты.*
|Метаданные.РегистрыРасчета.*.Измерения.*
|Метаданные.РегистрыРасчета.*.Ресурсы.*
|Метаданные.РегистрыРасчета.*.Реквизиты.*
|Метаданные.БизнесПроцессы.*.Реквизиты.*
|Метаданные.БизнесПроцессы.*.ТабличныеЧасти.*.Реквизиты.*
|Метаданные.Задачи.*.Реквизиты.*
|Метаданные.Задачи.*.РеквизитыАдресации.*
|Метаданные.Задачи.*.ТабличныеЧасти.*.Реквизиты.*
|" ;
ВсеХранимыеРеквизитыКонфигурации = РазвернутьМассивСтрокОбходаМетаданных( ПолучитьМассивСтрокМногострочнойСтроки( СтрокаВсехРеквизитов) ) ;
Возврат ВсеХранимыеРеквизитыКонфигурации;
КонецФункции
Функция ПолучитьВсеХранимыеРеквизитыКонфигурацииСоставногоТипа() Экспорт
ВсеХранимыеРеквизитыКонфигурации = ПолучитьВсеХранимыеРеквизитыКонфигурации( ) ;
Рез = Новый ТаблицаЗначений;
Рез. Колонки. Добавить( "Имя" , Новый ОписаниеТипов( "Строка" ) ) ;
Рез. Колонки. Добавить( "Тип" , Новый ОписаниеТипов( "ОписаниеТипов" ) ) ;
Рез. Колонки. Добавить( "КоличествоПростыхТипов" , Новый ОписаниеТипов( "Число" ) ) ;
Для каждого ТекРеквизит Из ВсеХранимыеРеквизитыКонфигурации Цикл
Реквизит = Вычислить( ТекРеквизит) ;
Тип = Реквизит. Тип;
КоличествоПростыхТипов = Тип. Типы( ) . Количество( ) ;
Если КоличествоПростыхТипов< > 1 Тогда
ТекСтрока = Рез. Добавить( ) ;
ТекСтрока. Имя = ТекРеквизит;
ТекСтрока. Тип = Тип;
ТекСтрока. КоличествоПростыхТипов = КоличествоПростыхТипов;
КонецЕсли ;
КонецЦикла ;
Возврат Рез;
КонецФункции
Функция ПолучитьВсеФормыКонфигурации() Экспорт
СтрокаВсехРеквизитов =
"
|Метаданные.ПланыОбмена.*.Формы.*
|Метаданные.КритерииОтбора.*.Формы.*
|Метаданные.ОбщиеФормы.*
|Метаданные.Справочники.*.Формы.*
|Метаданные.Документы.*.Формы.*
|Метаданные.ЖурналыДокументов.*.Формы.*
|Метаданные.Перечисления.*.Формы.*
|Метаданные.Отчеты.*.Формы.*
|Метаданные.Обработки.*.Формы.*
|Метаданные.ПланыВидовХарактеристик.*.Формы.*
|Метаданные.ПланыСчетов.*.Формы.*
|Метаданные.ПланыВидовРасчета.*.Формы.*
|Метаданные.РегистрыСведений.*.Формы.*
|Метаданные.РегистрыНакопления.*.Формы.*
|Метаданные.РегистрыБухгалтерии.*.Формы.*
|Метаданные.РегистрыРасчета.*.Формы.*
|Метаданные.БизнесПроцессы.*.Формы.*
|Метаданные.Задачи.*.Формы.*
|" ;
ВсеФормыКонфигурации = РазвернутьМассивСтрокОбходаМетаданных( ПолучитьМассивСтрокМногострочнойСтроки( СтрокаВсехРеквизитов) ) ;
Возврат ВсеФормыКонфигурации;
КонецФункции
Функция ПолучитьВсеМакетыКонфигурации() Экспорт
СтрокаВсехРеквизитов =
"
|Метаданные.ПланыОбмена.*.Макеты.*
|Метаданные.ОбщиеМакеты.*
|Метаданные.Справочники.*.Макеты.*
|Метаданные.Документы.*.Макеты.*
|Метаданные.ЖурналыДокументов.*.Макеты.*
|Метаданные.Перечисления.*.Макеты.*
|Метаданные.Отчеты.*.Макеты.*
|Метаданные.Обработки.*.Макеты.*
|Метаданные.ПланыВидовХарактеристик.*.Макеты.*
|Метаданные.ПланыСчетов.*.Макеты.*
|Метаданные.ПланыВидовРасчета.*.Макеты.*
|Метаданные.РегистрыСведений.*.Макеты.*
|Метаданные.РегистрыНакопления.*.Макеты.*
|Метаданные.РегистрыБухгалтерии.*.Макеты.*
|Метаданные.РегистрыРасчета.*.Макеты.*
|Метаданные.БизнесПроцессы.*.Макеты.*
|Метаданные.Задачи.*.Макеты.*
|" ;
ВсеМакетыКонфигурации = РазвернутьМассивСтрокОбходаМетаданных( ПолучитьМассивСтрокМногострочнойСтроки( СтрокаВсехРеквизитов) ) ;
Возврат ВсеМакетыКонфигурации;
КонецФункции
Категория:
Метаданные Открыть запись регистра сведений по ключу. Код 1C v 8.2 УП
СтруктураФормы = Новый Структура;
СтруктураФормы. Вставить( "Пользователь" , Пользователь) ;
СтруктураФормы. Вставить( "Настройка" , Элемент. ТекущаяСтрока) ;
МассивКлюча = Новый Массив;
МассивКлюча. Добавить( СтруктураФормы) ;
КлючЗаписи = Новый ( "РегистрСведенийКлючЗаписи.НастройкиПользователей" , МассивКлюча) ;
СтруктураКлюча = Новый Структура;
СтруктураКлюча. Вставить( "Ключ" , КлючЗаписи) ;
СтруктураЗаполнения = Новый Структура;
СтруктураЗаполнения. Вставить( "ЗначенияЗаполнения" , СтруктураФормы) ;
Попытка
ОткрытьФорму( "РегистрСведений.НастройкиПользователей.Форма.ФормаЗаписи" , СтруктураКлюча, ЭтаФорма) ;
Исключение
ОписаниеОшибки = ОписаниеОшибки( ) ;
Если Найти( ОписаниеОшибки, "Объект не найден" ) Тогда
ОткрытьФорму( "РегистрСведений.НастройкиПользователей.Форма.ФормаЗаписи" , СтруктураЗаполнения, ЭтаФорма) ;
КонецЕсли ;
КонецПопытки ;
Категория:
Регистры сведений Получить данные из текущей строки таблицы Таблица “
ОтклонениеПоВыручке ” ссылается на одноименную табличную часть в документе.
Код 1C v 8.2 УП ИдСтроки = Элементы. ОтклонениеПоВыручке. ТекущаяСтрока;
ДанныеСтроки = Объект. ОтклонениеПоВыручке. НайтиПоИдентификатору( ИдСтроки) ;
Категория:
Управляемое приложение, Тонкий клиент Как открыть список справочника, чтобы курсор был на нужном элементе? Нужно иметь ссылку на интересующий элемент и использовать параметр формы
ТекущаяСтрока.
Например, для того чтобы сразу увидеть открытый элемент в списке товаров, нужно, находясь в форме элемента справочника Товары, выполнить следующий код:
Код 1C v 8.х ПараметрыФормы = Новый Структура( "ТекущаяСтрока" , Объект. Ссылка) ;
ОткрытьФорму( "Справочник.Товары.ФормаСписка" , ПараметрыФормы) ;
Категория:
Справочники Универсальная процедура проверки на дубли строк в табличной части документа Код 1C v 8.2 УП
Процедура ПроверимДублиСтрок(ДокументСсылка,ИмяТабЧасти,ПроверяемыеРеквизиты,Отказ)
ТаблицаДокумента = ДокументСсылка[ИмяТабЧасти]. Выгрузить( ) ;
ТаблицаДокумента. Колонки. Добавить( "КвоПроверкаДублей" ) ;
ТаблицаДокумента. ЗаполнитьЗначения( 1 , "КвоПроверкаДублей" ) ;
ТаблицаДокумента. Свернуть( ПроверяемыеРеквизиты, "КвоПроверкаДублей" ) ;
Для Каждого ТекущаяСтрока Из ТаблицаДокумента Цикл
Если ТекущаяСтрока. КвоПроверкаДублей > 1 Тогда
РеквизитыДляСообщения = "" ;
Стр = СокрЛП( ПроверяемыеРеквизиты) ;
Пока Найти( Стр, "," ) > 0 Цикл
НаимРеквизита = СокрЛП( Лев( Стр, Найти( Стр, "," ) - 1 ) ) ;
Стр = Прав( Стр, СтрДлина( Стр) - Найти( Стр, "," ) ) ;
РеквизитыДляСообщения = РеквизитыДляСообщения+ ТекущаяСтрока[НаимРеквизита]+ ", " ;
КонецЦикла ;
РеквизитыДляСообщения = РеквизитыДляСообщения+ ТекущаяСтрока[СокрЛП( Стр) ];
Сообщить( "Информация " + РеквизитыДляСообщения+ " введена несколько раз в табличную часть, проведение невозможно!" ) ;
Отказ = Истина ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
Пример обращения к процедуре проверки
Код 1C v 8.2 УП
Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты)
Если Запасы. Количество( ) = 0 Тогда
Возврат ;
КонецЕсли ;
ПроверимДублиСтрок( Ссылка, "Запасы" , "Номенклатура, АлгоритмФормированияШК,Регион" , Отказ) ;
КонецПроцедуры
Да, в списке реквизитов добавленные случайно пробелы игнорируются
Процедуру можно добавить в общий модуль и обращаться к ней из любого документа
Категория:
Документы Как получить виды субконто счета Пример получения возможных видов субконто у счета
Код 1C v 8.2 УП &НаСервере
Процедура ВывестиСубконтоСчета(сч)
ТаблицаСубконто = Сч. ВидыСубконто;
Для Каждого ТекущаяСтрока Из ТаблицаСубконто Цикл
Сообщить( ТекущаяСтрока. ВидСубконто) ;
КонецЦикла ;
КонецПроцедуры
Пример получения значений субконто в движениях документа
Код 1C v 8.2 УП &НаСервере
Процедура ВывестиСубконтоДокумента(ДокументПроверки)
Регистр = РегистрыБухгалтерии. Бухгалтерский;
ДвиженияБУ = Регистр. ВыбратьПоРегистратору( ДокументПроверки) ;
Пока ДвиженияБУ. Следующий( ) Цикл
Сообщить( "Проводка " + ДвиженияБУ. НомерСтроки) ;
Сообщить( "Счет Дт " + ДвиженияБУ. СчетДт) ;
ТаблицаСубконтоДт = ДвиженияБУ. СчетДт. ВидыСубконто;
Для Каждого ТекущаяСтрока Из ТаблицаСубконтоДт Цикл
Сообщить( "Субконто Дт" + ТекущаяСтрока. НомерСтроки + " - " + ДвиженияБУ. СубконтоДт[ТекущаяСтрока. ВидСубконто]) ;
КонецЦикла ;
Сообщить( "Счет Кт " + ДвиженияБУ. СчетКт) ;
ТаблицаСубконтоКт = ДвиженияБУ. СчетКт. ВидыСубконто;
Для Каждого ТекущаяСтрока Из ТаблицаСубконтоКт Цикл
Сообщить( "Субконто Кт" + ТекущаяСтрока. НомерСтроки + " - " + ДвиженияБУ. СубконтоКт[ТекущаяСтрока. ВидСубконто]) ;
КонецЦикла ;
КонецЦикла ;
КонецПроцедуры
Категория:
Регистры бухгалтерии Ввод документа на основании - Программно Код 1C v 8.х НовДок = Документы. ПеречислениеНДФЛвБюджет. СоздатьДокумент( ) ;
НовДок. Заполнить( ЭлементыФормы. ДокументСписок. ТекущаяСтрока) ;
НовДок. ПолучитьФорму( ) . Открыть( ) ;
Процедура ОбработкаЗаполнения(Основание)
Если ТипЗнч( Основание) = Тип( "ДокументСсылка.ЗарплатаКВыплатеОрганизаций" ) Тогда
Комментарий = Основание. Комментарий;
КраткийСоставДокумента = Основание. КраткийСоставДокумента;
Организация = Основание. Организация;
Ответственный = Основание. Ответственный;
ДатаПлатежа = Основание. ПериодРегистрации;
МесяцНалоговогоПериода = Основание. ПериодРегистрации;
Для Каждого ТекСтрокаЗарплата Из Основание. Зарплата Цикл
НоваяСтрока = СотрудникиОрганизации. Добавить( ) ;
НоваяСтрока. Сумма = ТекСтрокаЗарплата. Сумма;
НоваяСтрока. ФизЛицо = ТекСтрокаЗарплата. Физлицо;
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры
Категория:
Документы Табличное поле ~ Как изменить шрифт при активизации строки табличного поля? Код 1C v 8.х Процедура ТабличноеПолеПриАктивизацииСтроки(Элемент)
Если Элемент. ТекущаяСтрока. Статус = Ложь Тогда
Элемент. ОформлениеСтроки( Элемент. ТекущаяСтрока) . Шрифт = Новый Шрифт( Элемент. ОформлениеСтроки( Элемент. ТекущаяСтрока) . Шрифт, , , ложь ) ;
КонецЕсли ;
КонецПроцедуры
Категория:
Работа с Формой (Диалог) и её элементами Примеры работы с Деревом значений в УП Так как работа с ДеревомЗначений и ТаблицейЗначений в данном контексте практически не отличается, в примере будет использоваться ДеревоЗначений, все тоже самое за исключением иерархии применимо и к ТаблицеЗначений. Как известно, в
платформе 1С 8.1 не составляло никакого труда связать дерево значений с табличным полем на форме, единственное что при этом нужно было не забыть так это СоздатьКолонки() .
В управляемом приложении 1С 8.2 сделать это не так просто как кажется на первый взгляд.
Обращаю внимание, что
ДеревоЗначений доступно только на сервере, в толстом клиенте и внешнем соединение. В данных самой управляемой формы для моделирования дерева используется тип ДанныеФормыДерево. Для преобразования ДеревоЗначений <-> ДанныеФормыДерево используются методы управляемой формы ЗначениеВРеквизитФормы() и РеквизитФормыВЗначение(). Для непосредственного отображения дерева используется элемент формы типа ТаблицаФормы связанный через реквизит ПутьКДанным с реквизитом формы типа ДанныеФормыДерево. Если Вам не очень понятна вышеописанная связь объектов, не огорчайтесь, ниже рассмотрим практический пример и все встанет на свои места.
Задача: Имеется дерево значений, необходимо отобразить его на управляемой форме.
Создаем новую внешнюю обработку (
Скачивать файлы может только зарегистрированный пользователь! ), добавляем управляемую форму и создаем обработчик ПриСозданииНаСервере(). Никаких реквизитов и элементов “вручную” не добавляем, будем делать это программно.
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДеревоОбъект = Новый ДеревоЗначений;
ДеревоОбъект. Колонки. Добавить( "Узел" , Новый ОписаниеТипов( "Строка" ) ) ;
Для к1 = 1 По 3 Цикл
СтрокаУ1 = ДеревоОбъект. Строки. Добавить( ) ;
СтрокаУ1 . Узел = "Узел" + к1 ;
Для к2 = 1 По 3 Цикл
СтрокаУ2 = СтрокаУ1 . Строки. Добавить( ) ;
СтрокаУ2 . Узел = СтрокаУ1 . Узел+ к2 ;
Для к3 = 1 По 3 Цикл
СтрокаУ3 = СтрокаУ2 . Строки. Добавить( ) ;
СтрокаУ3 . Узел = СтрокаУ2 . Узел+ к3 ;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов. Добавить( Новый РеквизитФормы( "Дерево" ,
Новый ОписаниеТипов( "ДеревоЗначений" ) ) ) ;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
МассивДобавляемыхРеквизитов. Добавить(
Новый РеквизитФормы( Колонка. Имя, Колонка. ТипЗначения, "Дерево" ) ) ;
КонецЦикла ;
ИзменитьРеквизиты( МассивДобавляемыхРеквизитов) ;
ЗначениеВРеквизитФормы( ДеревоОбъект, "Дерево" ) ;
ЭлементДерево = Элементы. Добавить( "Дерево" , Тип( "ТаблицаФормы" ) ) ;
ЭлементДерево. ПутьКДанным = "Дерево" ;
ЭлементДерево. Отображение = ОтображениеТаблицы. Дерево;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
НовыйЭлемент = Элементы. Добавить( Колонка. Имя, Тип( "ПолеФормы" ) ,
ЭлементДерево) ;
НовыйЭлемент. Вид = ВидПоляФормы. ПолеВвода;
НовыйЭлемент. ПутьКДанным = "Дерево." + Колонка. Имя;
КонецЦикла ;
КонецПроцедуры
Механизм Drag and D_rop (или проще говоря “Перетаскивания”) для ДереваЗначений расположенного на управляемой форме управляемого приложения
Основная сложность реализации механизма перетаскивания заключается в том, что у строки ДереваЗначений платформа не позволяет просто изменить родителя, т.е. переподчинить строку. Единственный способ это сделать – создать новую строку вместе со всеми подчиненными строками, т.е. полностью скопировать всю ветку дерева вместе со всей иерархией и подчинить ее требуемой строке-родителю, после чего удалить исходную ветку. Данная задача распадается на две подзадачи:
1). Перед перетаскиванием необходимо проверить корректность данной операции, узел дерева нельзя переносить в узлы подчиненные ему самому, т.е. родительский узел нельзя переносить в дочерние, т.к. это приведет к “бесконечной рекурсии” и “падению” платформы. Это реализуется с помощью обработчика события ЭлементДеревоПроверкаПеретаскивания(…)
2). Если перетаскивание возможно, то при помощи обработчика ЭлементДеревоПеретаскивание(…) запускается рекурсивная функция, которая создает новую ветку дерева, подчиненную требуемому родителю, а исходную удаляет.
Обращаю особое внимание на то, что в платформе 8.2 реализован механизм множественного выбора элементов, поэтому вышеуказанные операции необходимо произвести для всех выбранных пользователем элементов. (
Скачивать файлы может только зарегистрированный пользователь! )
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ЭлементДерево. МножественныйВыбор= Истина ;
ЭлементДерево. РазрешитьПеретаскивание= Истина ;
ЭлементДерево. РазрешитьНачалоПеретаскивания= Истина ;
ЭлементДерево. УстановитьДействие( "ПроверкаПеретаскивания" ,
"ЭлементДеревоПроверкаПеретаскивания" ) ;
ЭлементДерево. УстановитьДействие( "Перетаскивание" ,
"ЭлементДеревоПеретаскивание" ) ;
КонецПроцедуры
&НаКлиенте
Функция ПроверитьВозможностьПереноса(ПереносимыйЭлемент, Знач НовыйРодитель)
Пока НЕ НовыйРодитель = Неопределено Цикл
Если ПереносимыйЭлемент = НовыйРодитель Тогда
Возврат Ложь ;
КонецЕсли ;
НовыйРодитель = НовыйРодитель. ПолучитьРодителя( ) ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
&НаКлиенте
Функция СкопироватьСтрокуДерева(РеквизитДерево, Приемник, Источник)
Перем НоваяСтрока, ОбратныйИндекс, КолПодчиненныхСтрок;
Если Источник = Неопределено Тогда
Возврат Неопределено ;
КонецЕсли ;
Если Приемник = Неопределено Тогда
НоваяСтрока = РеквизитДерево. ПолучитьЭлементы( ) . Добавить( ) ;
Иначе
НоваяСтрока = Приемник. ПолучитьЭлементы( ) . Добавить( ) ;
КонецЕсли ;
ЗаполнитьЗначенияСвойств( НоваяСтрока, Источник) ;
КолПодчиненныхСтрок = Источник. ПолучитьЭлементы( ) . Количество( ) ;
Для ОбратныйИндекс = 1 По КолПодчиненныхСтрок Цикл
ПодчиненнаяСтрока = Источник. ПолучитьЭлементы( )
[КолПодчиненныхСтрок - ОбратныйИндекс];
СкопироватьСтрокуДерева( РеквизитДерево, НоваяСтрока, ПодчиненнаяСтрока) ;
КонецЦикла ;
Если Источник. ПолучитьРодителя( ) = Неопределено Тогда
РеквизитДерево. ПолучитьЭлементы( ) . Удалить( Источник) ;
Иначе
Источник. ПолучитьРодителя( ) . ПолучитьЭлементы( ) . Удалить( Источник) ;
КонецЕсли ;
Возврат НоваяСтрока;
КонецФункции
&НаКлиенте
Процедура ЭлементДеревоПроверкаПеретаскивания(Элемент, ПараметрыПеретаскивания,
СтандартнаяОбработка, Строка, Поле)
СтандартнаяОбработка = Ложь ;
РеквизитДерево = ЭтаФорма["Дерево" ];
ИДНовыйРодитель = Строка;
НовыйРодитель = ? ( ИДНовыйРодитель = Неопределено , Неопределено ,
РеквизитДерево. НайтиПоИдентификатору( ИДНовыйРодитель) ) ;
МассивИДПереносимыхЭлементов = ПараметрыПеретаскивания. Значение;
Для каждого ИДПереносимыйЭлемент из МассивИДПереносимыхЭлементов Цикл
ПереносимыйЭлемент = РеквизитДерево. НайтиПоИдентификатору(
ИДПереносимыйЭлемент) ;
Если НЕ ПроверитьВозможностьПереноса( ПереносимыйЭлемент,
НовыйРодитель) Тогда
ПараметрыПеретаскивания. Действие= ДействиеПеретаскивания. Отмена;
Прервать ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Процедура ЭлементДеревоПеретаскивание(Элемент, ПараметрыПеретаскивания,
СтандартнаяОбработка, Строка, Поле)
СтандартнаяОбработка= Ложь ;
РеквизитДерево = ЭтаФорма["Дерево" ];
ИДПриемник = Строка;
Приемник = ? ( ИДПриемник = Неопределено , Неопределено ,
РеквизитДерево. НайтиПоИдентификатору( ИДПриемник) ) ;
МассивИДИсточник = ПараметрыПеретаскивания. Значение;
Для Каждого ИДИсточник Из МассивИДИсточник Цикл
Источник = РеквизитДерево. НайтиПоИдентификатору( ИДИсточник) ;
НоваяСтрока = СкопироватьСтрокуДерева( РеквизитДерево, Приемник, Источник) ;
Если Приемник = Неопределено и НоваяСтрока< > Неопределено Тогда
Элементы["Дерево" ]. Развернуть( НоваяСтрока. ПолучитьИдентификатор( ) ,
Истина ) ;
КонецЕсли ;
КонецЦикла ;
Если НЕ Приемник = Неопределено Тогда
Элементы["Дерево" ]. Развернуть( ИДПриемник, Истина ) ;
КонецЕсли ;
КонецПроцедуры
Реализовать трехпозиционный флажок в ДеревеЗначений на управляемой форме
который работает по следующему алгоритму:
* Если у элемента ДереваЗначений нет подчиненных элементов, то флажок может быть либо “включен”, либо “выключен”.
* Если у элемента есть подчиненные, то флажок “включен”, если ВКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов, “выключен” если ВЫКЛЮЧЕНЫ флажки у ВСЕХ подчиненных элементов.
Если у некоторых подчиненных элементов флажки включены, а у некоторых выключены, то флажок родительского элемента имеет значение “неопределенно”.
* При включении флажка у родительского элемента, включаются флажки ВСЕХ подчиненных, при выключении флажка у родительского элемента, выключаются флажки ВСЕХ подчиненных.
Возьмем из первой статьи процедуру построения дерева значений и доработаем ее, добавив в дерево еще одну колонку, которая будет содержать элемент управления флажок и реализуем для него обработчик события “ПриИзменении”. Весь алгоритм сводится к обработке изменения флажка: у всех подчиненных элементов необходимо включить/выключить флажки в зависимости от состояния флажка текущего элемента, а у всех родителей текущего элемента (которые расположены на верхних уровнях иерархии) проставить флажки в состояния “включен”/”выключен”/”неопределенно” в соответствии с вышеописанным алгоритмом. (
Скачивать файлы может только зарегистрированный пользователь! )
Код 1C v 8.2 УП &НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
ДеревоОбъект = Новый ДеревоЗначений;
ДеревоОбъект. Колонки. Добавить( "Узел" , Новый ОписаниеТипов( "Строка" ) ) ;
ДеревоОбъект. Колонки. Добавить( "Пометка" , Новый ОписаниеТипов( "Число" ) ) ;
Для к1 = 1 По 3 Цикл
СтрокаУ1 = ДеревоОбъект. Строки. Добавить( ) ;
СтрокаУ1 . Узел = "Узел" + к1 ;
Для к2 = 1 По 3 Цикл
СтрокаУ2 = СтрокаУ1 . Строки. Добавить( ) ;
СтрокаУ2 . Узел = СтрокаУ1 . Узел+ к2 ;
Для к3 = 1 По 3 Цикл
СтрокаУ3 = СтрокаУ2 . Строки. Добавить( ) ;
СтрокаУ3 . Узел = СтрокаУ2 . Узел+ к3 ;
КонецЦикла ;
КонецЦикла ;
КонецЦикла ;
МассивДобавляемыхРеквизитов = Новый Массив;
МассивДобавляемыхРеквизитов. Добавить( Новый РеквизитФормы( "Дерево" ,
Новый ОписаниеТипов( "ДеревоЗначений" ) ) ) ;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
МассивДобавляемыхРеквизитов. Добавить( Новый РеквизитФормы( Колонка. Имя,
Колонка. ТипЗначения, "Дерево" ) ) ;
КонецЦикла ;
ИзменитьРеквизиты( МассивДобавляемыхРеквизитов) ;
ЗначениеВРеквизитФормы( ДеревоОбъект, "Дерево" ) ;
ЭлементДерево = Элементы. Добавить( "Дерево" , Тип( "ТаблицаФормы" ) ) ;
ЭлементДерево. ПутьКДанным = "Дерево" ;
ЭлементДерево. Отображение = ОтображениеТаблицы. Дерево;
Для Каждого Колонка Из ДеревоОбъект. Колонки Цикл
НовыйЭлемент = Элементы. Добавить( Колонка. Имя, Тип( "ПолеФормы" ) ,
ЭлементДерево) ;
НовыйЭлемент. ПутьКДанным = "Дерево." + Колонка. Имя;
Если НЕ Колонка. Имя = "Пометка" Тогда
НовыйЭлемент. Вид = ВидПоляФормы. ПолеВвода;
Иначе
НовыйЭлемент. Вид = ВидПоляФормы. ПолеФлажка;
НовыйЭлемент. ТриСостояния = Истина ;
НовыйЭлемент. УстановитьДействие( "ПриИзменении" ,
"ФлажокПриИзменении" ) ;
КонецЕсли ;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Процедура ФлажокПриИзменении(Элемент)
ИДТекущейСтроки = Элементы["Дерево" ]. ТекущаяСтрока;
Если ИДТекущейСтроки < > Неопределено Тогда
ЭлементКоллекции = ЭтаФорма["Дерево" ]. НайтиПоИдентификатору(
ИДТекущейСтроки) ;
Если ЭлементКоллекции. Пометка = 2 Тогда
ЭлементКоллекции. Пометка = 0 ;
КонецЕсли ;
УстановкаФлажков( ЭлементКоллекции, ЭлементКоллекции. Пометка) ;
Родитель = ЭлементКоллекции. ПолучитьРодителя( ) ;
Пока Родитель < > Неопределено Цикл
Родитель. Пометка = ? ( УстановленноДляВсех( ЭлементКоллекции) ,
ЭлементКоллекции. Пометка, 2 ) ;
ЭлементКоллекции = Родитель;
Родитель = ЭлементКоллекции. ПолучитьРодителя( ) ;
КонецЦикла ;
КонецЕсли ;
КонецПроцедуры
&НаКлиенте
Процедура УстановкаФлажков(ЭлементКоллекции, ЗначениеПометки)
ПодчинЭлементы = ЭлементКоллекции. ПолучитьЭлементы( ) ;
Для Каждого ТекЭлемент Из ПодчинЭлементы Цикл
ТекЭлемент. Пометка = ЗначениеПометки;
УстановкаФлажков( ТекЭлемент, ТекЭлемент. Пометка) ;
КонецЦикла ;
КонецПроцедуры
&НаКлиенте
Функция УстановленноДляВсех(ЭлементКоллекции)
СоседниеЭлементы =
ЭлементКоллекции. ПолучитьРодителя( ) . ПолучитьЭлементы( ) ;
Для Каждого ТекЭлемент Из СоседниеЭлементы Цикл
Если ТекЭлемент. Пометка < > ЭлементКоллекции. Пометка Тогда
Возврат Ложь ;
КонецЕсли ;
КонецЦикла ;
Возврат Истина ;
КонецФункции
Источник Категория:
Работа с Деревом Значений Табличное поле ~ Как установить текущую строку в табличном поле? Схема программной установки нужной нам строки активной.
Для начала хочу напомнить, что данные табличной части документа(или таблицы значений) и табличное поле – это разные объекты. Для того чтобы сделать какие-то визуальные действия мы работаем с табличным полем. В данном случае, мы будем использовать его свойство "ТекущаяСтрока", как раз оно и отвечает за то, какая строка активна.
Чтобы выделить в табличном поле необходимую нам строку понадобится два шага:
1. Найти нужную нам строку в объекте данных которые отображает табличное поле
Подчеркну что здесь понадобиться именно объект данных. Например, у нас имеется документ РеализацияТоваровУслуг у которого есть табличная часть «Товары» и мы решили сделать активной 2-ю строку на форме документа. Тогда в модуле формы документа мы напишем:
Код 1C v 8.х
НужнаяСтрока = Товары[1 ];
Или мы знаем, что во второй строке в колонке Номенклатура у элемента Код равен «001» тогда мы используем конструкцию:
Код 1C v 8.х
НужнаяСтрока = Товары. Найти( Справочники. Номенклатура. НайтиПоКоду( «001 ») ) ;
2. Установить значением текущей строки найденную строку
Теперь нам нужно присвоить значение переменной НужнаяСтрока свойству табличного поля ТекущаяСтрока:
Код 1C v 8.х
ЭлементыФормы. Товары. Текущаястрока = НужнаяСтрока;
Или
Код 1C v 8.х
ЭлементыФормы. ТабличноеПоле1 . Текущаястрока = НужнаяСтрока;
В итоге строки кода могут выглядеть вот так:
Код 1C v 8.х НужнаяСтрока = Товары. Найти( Справочники. Номенклатура. НайтиПоКоду( «001 ») ) ;
ЭлементыФормы. ТабличноеПоле1 . Текущаястрока = НужнаяСтрока;
Категория:
Работа с Формой (Диалог) и её элементами