Войти
Образовательный портал. Образование
  • Семь советов от Отцов Церкви
  • Унжа (Костромская область)
  • Митрополит алексий московский святитель и чудотворец краткая биография Митрополит алексий годы
  • Попробуем разобраться в см - Документ
  • Открытия галилея в области астрономии
  • Сопливые грибы но не маслята
  • Записать документ с проведением 1с 8. с дополнительные сведения в режиме Предприятие

    Записать документ с проведением 1с 8. с дополнительные сведения в режиме Предприятие

    Простая задача:

    • На форме организовать выбор файла (формат файла txt)
    • Заполнить файл данными
    • Ну и сохранить естественно (если файл с данными, то чтобы спросил перезаписать или нет).

    Как это сделать?

    Организуем форму толстого клиента 1С

    Выполним эту задачу на примере формы внешней обработки. Создаем внешнюю обработку, добавляем форму, на форму кидаем поле с типом строка без ограничения длины.

    У добавленного нами поля нужно включить кнопку выбора.

    Добавим обработчик нажатия.

    Обратите внимание, что в модуле у нас появились две функции – одна обработчик нажатия кнопки «Выполнить», которая была автоматически добавлена на форму обработки при ее создании. Другая – добавленный нами обработчик.

    Организуем форму тонкого клиента 1С

    Пример такой же организации формы на тонком клиенте 1С.

    Добавляем реквизит в обработку — неограниченная строка (т.е. длина = 0).

    Только что добавленный реквизит вытаскиваем на форму. Чтобы открыть его свойства — нажмите на вытащенном реквизите правой кнопкой мыши.

    Свойство КнопкаВыбора установите Да.

    Тонкий клиент не добавляет автоматически кнопку. Поэтому нам нужно самостоятельно на форму обработки добавить кнопку Записать.

    На закладке Команды добавьте новую команду и нажмите в ее свойствах лупу, чтобы добавить обработчик.

    Также перетащите добавленную команду на форму (влево).

    В модуле у нас также две функции – одна обработчик нажатия кнопки «Записать», который мы добавили. Другая – добавленный нами обработчик события при выборе.

    Программируем выбор [имени и места записи] файла

    В Windows есть общепринятый диалог работы с выбором файла.

    Из 1С есть доступ к управлению этим диалогом. Для этого существует специальный объект «ДиалогВыбораФайла».

    Диалог = Новый ДиалогВыбораФайла(РежимДиалогаВыбораФайла.Сохранение);

    Диалог.Заголовок = "Выберите имя файла для сохранения";

    Диалог.МножественныйВыбор = Ложь;

    Диалог.Фильтр = "Текстовый файл(*.txt)|*.txt";

    //Вызов собственно диалога на экран

    Если Диалог.Выбрать() Тогда

    //Сюда попадем только если пользователь нажал ОК

    //Сохранение выбранного имени файла (полного имени, значит включая путь к нему)

    ИмяФайла = Диалог.ПолноеИмяФайла;

    КонецЕсли;

    Если Вы хотите дать возможность выбирать несколько расширений файлов, например txt и rtf, то нужно написать так:

    Диалог.Фильтр = "Документ Microsoft Word (*.txt)|*.txt|"
    + "Документ Microsoft Excell (*.rtf)|*.rtf|";

    Программируем запись файла на диск

    Для записи текстовых файлов в 1С есть объект «ЗаписьТекста».

    Работа с ним очень простая.

    Вот пример кода для нашего случая:

    Файл = Новый ЗаписьТекста(ИмяФайла);
    Файл.ЗаписатьСтроку("Привет!");
    Файл.ЗаписатьСтроку("Как дела?");
    Файл.Закрыть();

    Скачать готовый пример

    Вы можете скачать готовый пример такой обработки для изучения.

    В 1с дополнительные сведения представляют — это механизм позволяющий хранить дополнительные данные для различных объектов метаданных (справочник, документ и т.п.). Это удобно тем, что не требуется вносить изменений в конфигурацию. В конфигурациях использующих управляемое приложение (Бухгалтерия 3.0, Управление торговлей 11 и т.п.) дополнительные сведения хранятся в регистре ДополнительныеСведения , у него два измерения: Объект — ссылка на объект к которому относится дополнительное сведение, Свойство — идентификатор конкретного сведения, тип план видов характеристик ДополнительныеРеквизитыИСведения.

    1с дополнительные сведения в режиме Предприятие

    Рассмотрим, как добавить в документе дополнительное сведение. Для примера возьмем конфигурацию Управление торговлей 11 , документ Авансовый отчет .

    • Откроем любой документ для которого необходимо дополнительное сведение;
    • На форме документа нажмем кнопку ;
    • Откроется форма дополнительных сведений;
    • Нажимаем кнопку Все действия -> Изменить состав дополнительных сведений ;

    • Нажимаем кнопку Добавить -> Новое ;
    • В открывшемся окне заполняем Наименование свойства и его Тип;

    • Жмем Записать и закрыть;
    • Теперь снова откроем наш документ и нажмем кнопку Открыть дополнительные сведения ;
    • В форме 1с дополнительные сведения появится строчка с добавленным свойством. Ему можно задать любое значение заданного типа;
    • Данное свойство будет доступно во всех документах Авансовый отчет , для каждого документа можно задать свое значение.

    Функция получающая в 1с дополнительные сведения

    • Ссылка. Тип: Любая ссылка . Ссылка на объект имеющий дополнительные сведения;
    • Свойство. Тип: План видов характеристик ДополнительныеРеквизитыИСведения . Свойство, значение которого для данного объекта мы хотим получить.

    Функция ПолучитьЗначениеДопСведений(Ссылка,Свойство) Экспорт Запрос = Новый Запрос; Запрос.УстановитьПараметр("Ссылка", Ссылка); Запрос.УстановитьПараметр("Свойство", Свойство); Запрос.Текст = "ВЫБРАТЬ | ДополнительныеСведения.Значение |ИЗ | РегистрСведений.ДополнительныеСведения КАК ДополнительныеСведения |ГДЕ | ДополнительныеСведения.Объект = &Ссылка | И ДополнительныеСведения.Свойство = &Свойство"; Результат = Запрос.Выполнить().Выбрать(); Если Результат.Количество() = 0 Тогда Возврат Неопределено; Иначе Результат.Следующий(); Возврат Результат.Значение; КонецЕсли; КонецФункции

    1с дополнительные сведения функция программной записи

    Данная функция осуществляет программную запись значения в дополнительные сведения объекта по переданному свойству. Предназначена для конфигурации Управление торговлей 11. Возвращает значение Истина в случае успешной записи и Ложь в случае ошибки.

    Параметры:

    • Объект Тип: Любая ссылка. Ссылка на объект для которого записывается сведение;
    • Свойство Тип: План видов характеристик ДополнительныеРеквизитыИСведения. Дополнительное свойство;
    • Значение Тип: Произвольный(Задается при создании (редактировании) свойства в плане видов характеристик ДополнительныеРеквизитыИСведения). Значение, которое будет записано в дополнительные сведения.
    Функция ЗаписатьЗначениеДопСведения(Объект, Свойство, Значение) Попытка НаборЗаписей = РегистрыСведений.ДополнительныеСведения.СоздатьНаборЗаписей(); НаборЗаписей.Отбор.Объект.Установить(Объект); НаборЗаписей.Отбор.Свойство.Установить(Свойство); НоваяСтрокаНабора = НаборЗаписей.Добавить(); НоваяСтрокаНабора.Объект = Объект; НоваяСтрокаНабора.Свойство = Свойство; НоваяСтрокаНабора.Значение = Значение; НаборЗаписей.Записать(); Возврат Истина; Исключение Возврат Ложь; КонецПопытки; КонецФункции

    Если вы еще не знаете, как правильно работать с механизмом дополнительных реквизитов в 1с 8, то прочтите об этом в статье

    Для понимания особенностей записи и проведения документа в форме следует, прежде всего, разделять особенности записи самого объекта (ДокументОбъект ) и особенности работы расширения формы. Расширение формы документа действует, если основной реквизит формы имеет тип ДокументОбъект . Оно обеспечивает специфическую функциональность формы при редактировании и записи документа. Задача расширения заключается в реализации удобного для пользователя поведения формы. Но собственно запись и проведение документа выполняет, разумеется, объект, являющийся реквизитом формы. Расширение документа обрабатывает различные команды пользователя, выполняет предварительные проверки и другие сервисные действия, а затем вызывает запись объекта. Запись объекта выполняется так же, как и если бы она вызывалась средствами встроенного языка. То есть с точки зрения объекта запись в форме и запись средствами языка ничем не различаются. Таким образом, расширение обеспечивает некоторую сервисную функциональность, обращаясь в конечном итоге к функциональности объекта. Следует учитывать, что расширение формы действует, только если используются механизмы формы и не действует, если выполняется обращение непосредственно к объекту. Например, если вызвать метод Записать() у объекта ДокументОбъект , то никакие действия расширения формы не будут выполняться. Чтобы они выполнялись нужно вызывать метод ЗаписатьВФорме() .

    Далее мы рассмотрим те сервисные действия, которые обеспечивает расширение формы документа. В данном разделе, мы опишем только те действия, которые специфичны именно для расширения формы документа и не будем касаться общих действий, которые поддерживаются расширениями всех объектов.

    Установка даты документа
    При открытии формы нового документа, если дата документа не установлена (равна значению типа Дата по умолчанию), то документу устанавливается рабочая дата. Следует заметить, что используется именно рабочая дата, а не текущая (если не установлено использование текущей даты в качестве рабочей). Это дает возможность пользователю настроить рабочую дату так, чтобы новые документы вводились определенной датой. При этом в качестве даты устанавливается начало дня (дата без времени), даже если в качестве рабочей даты выступает текущая дата. Но если свойство АвтоВремя имеет значение НеИспользовать, и рабочая дата равна текущей, то устанавливается текущая дата, вместе со временем. Таким образом, для варианта АвтоВремя = НеИспользовать при открытии берется рабочая дата (если она отличается от текущей) или текущая дата вместе со временем, а для остальных вариантов установка времени откладывается на момент записи документа.

    При записи нового документа в форме если свойство АвтоВремя имеет значение отличное от НеИспользовать, и не используется оперативное проведение, и время документа пустое (0:00:00), то выполняется автоматическая установка времени на основании значения свойства АвтоВремя. Действие расширения формы в этом случае аналогично вызову метода УстановитьВремя() с вариантом выбранном в свойстве АвтоВремя и с использованием журналов документа.

    Расширение формы так же предоставляет команды для установки времени документа в начало дня, конец дня, перед предыдущим и за последующим документом.

    Установка режима записи
    При нажатии кнопки "ОК", если для документа в метаданных разрешено проведение, документ записывается в режиме проведения.

    Кроме того, расширение формы предоставляет две отдельные команды для записи с проведением и записи с отменой проведения.

    При любой записи документа в форме, если установлено свойство расширения формы ПриЗаписиПерепроводить и документ проведен, то выполняется запись в режиме проведения. Это позволяет исключить ситуацию, когда пользователь изменит документ, а движения документа не будут обновлены.

    Установка режима оперативного проведения
    При записи документа в форме, расширение формы выполняет установку режима проведения (оперативное или неоперативное проведение). Установка выполняется по следующему алгоритму.

    Вначале если свойство ИспользоватьРежимПроведения имеет значение Авто выполняется первичный подбор режима проведения из вариантов Оперативный, Неоперативный и Запрашивать.

    Если у пользователя нет права на неоперативное проведение – используется оперативное проведение.

    Если документ не проведен – используется оперативное проведение.

    Если дата документа равна текущей, а время меньше или равно текущему, то используется режим Запрашивать. Здесь и далее в этой статье сравнение даты имеется в виду без учета времени, а сравнение времени описывается отдельно.

    Если дата документа меньше текущей, то используется неоперативное проведение.

    Если дата документа равна текущей и время больше текущего – используется оперативное проведение.

    Дальнейшие действия системы определяются уже исходя из трех вариантов (Оперативный, Неоперативный и Запрашивать) установленных непосредственно в свойстве ИспользоватьРежимПроведения или на основании описанного алгоритма для варианта Авто.

    Если дата документа меньше текущей, используется оперативный режим и у пользователя есть права на неоперативное проведение, то пользователю предлагается использовать неоперативный режим. Если пользователь отказывается, то запись документа отменяется.

    Если дата документа меньше текущей, используется оперативный режим и у пользователя нет права на неоперативное проведение, то запись документа отменяется.

    Если дата документа меньше текущей и используется режим Запрашивать, то в зависимости от наличия прав на неоперативное проведение или выбирается неоперативный режим (без запроса пользователя), или запись документа отменяется.

    Если дата документа больше текущей и используется оперативный режим, то запись документа отменяется. Штатное поведение расширения формы не разрешает проведение документа завтрашней датой, даже если у пользователя есть права на неоперативное проведение. Это объясняется тем, что после появления документов проведенных завтрашней датой текущие остатки регистров используемых проводимыми оперативно документами перестают соответствовать реальным остаткам и механизм оперативного проведения для всех пользователей перестает работать адекватно.

    Полученный таким образом режим проведения (Оперативный или Неоперативный) используется при выполнении записи документа.

    Проверка прав
    При открытии формы документа, если документ проведен, а у пользователя нет права "Интерактивное изменение проведенных", то расширение переводит форму в режим ТолькоПросмотр .

    При записи документа в форме выполняется проверка прав на интерактивное проведение и интерактивную отмену проведения в соответствии с текущим режимом записи.

    Считывание движений
    При открытии формы документа, если есть табличные поля, связанные с движениями (наборами записей) объекта редактируемого в форме, то эти движения считываются из базы данных и соответственно отображаются в табличных полях.

    В любой реально работающей базе 1С может возникнуть ситуация, когда документ при проведении делает большое количество движений – несколько тысяч или даже несколько десятков тысяч. Данная статья посвящена особенностям записи таких больших наборов записей в базу.

    В ходе одной из работ по анализу производительности, проводимых нашими экспертами по технологическим вопросам, им пришлось столкнуться с проблемой отмены проведения документа, делающего несколько тысяч движений по одному из регистров бухгалтерии. Проблема проявлялась в непредсказуемости времени отмены проведения документа. Это время менялось от нормального (порядка минуты) до заведомо неадекватного (полчаса и более) для одного и того же документа. В некоторых случаях нашим экспертам не удавалось отменить проведение вообще – процесс не заканчивался до окончания рабочего дня и отменялся перезагрузкой сервера 1С.

    Проблема записи больших наборов особенно остро стоит именно для отмены проведения документов. Связано это с тем, что при проведении наборы можно дописывать порциями:

    Небольшое исследование, проведенное на эту тему, показало, что при использовании текущего (на момент написания статьи) релиза платформы 1С:Предприятия 8.1.15.41 время записи наборов линейно зависит от количества записей в наборе, то есть время записи 6 порций по 3 000 проводок и одной в 18 000 проводок одинаково. Однако также мы имели сведения, что запись несколькими порциями в ряде случаев может быть эффективнее, и в ходе работ, описанных в данной статье ниже, получили теоретическое объяснение – почему так может быть.

    К сожалению, при отмене проведения записывать наборы порциями не получается – удалить можно только все целиком, единственный предопределенный отбор по регистратору не оставляет вариантов.

    Известно, что запись больших наборов записей регистров накопления с использованием 32-разрядного сервера 1С:Предприятия может завершаться аварийно с сообщением о нехватке памяти, но в данном случае, хотя и использовался 32-разрядный сервер, никаких сообщений не выдавалось, да и работа шла не с регистром накопления, а с регистром бухгалтерии.

    Мы инициировали обсуждение данной проблемы в партнерской конференции 1С http://partners.v8.1c.ru/forum/thread.jsp?id=856332 (требует регистрации).

    Коллеги успокоили, подтвердив, что принципиальных ограничений в данном случае нет, и проблема должна иметь решение. В качестве примера приводились данные о реальных документах, делающих по 250 000 проводок.

    Одной из интересных идей (Доронин Сергей, ВДГБ-Софт, Йошкар-Ола http://www.vdgb-soft.ru/) было отменять проведение документа вне транзакции:

    Решение было найдено специалистом фирмы-заказчика, который отменил проведение проблемного документа, переведя базу в монопольный режим (фрагмент кода из Синтакс-помощника):

    По данному факту мы получили разъяснения из 1С (там же в конференции):

    «В монопольном режиме не происходит обращение к менеджеру управляемых блокировок. Так как у вас достаточно большое количество движений, менеджер блокировок тратит значительное время на поочередное блокирование ресурсов в разделенном режиме. В вашей ситуации можно посоветовать перед началом записи движений вместо установки монопольного режима поставить управляемую блокировку на весь регистр бухгалтерии».

    Полученный ответ позволил не только обосновать экспериментально найденный способ решения проблемы, но прояснил и еще два момента:

    • Почему запись набора записей несколькими порциями в ряде случаев может быть эффективнее, чем одной, о чем говорилось выше.
    • Для чего в типовых решениях 1С, например, в конфигурации «1С:Управление производственным предприятием 8» в модуле документа «Переоценка валютных средств» установлена такая, явно избыточная, блокировка.

    Уже после того, как проблема была решена, были получены сведения об альтернативном способе решения проблемы (Пиголкин Станислав, Акселот, Москва http://www.axelot.ru/). Для этой цели рекомендовано отключать использование итогов:

    Про метод УстановитьИспользованиеИтогов(<Признак>) в Синтакс-помощнике сказано:

    «Устанавливает признак использования итогов. Если использование итогов отключено, то при записи набора записей регистра не будет производиться пересчет итогов, но при этом будут не доступны виртуальные таблицы расчета остатков и оборотов.
    Данный режим работы регистра позволяет повысить скорость записи набора записей регистра. Он может быть полезен при массовых загрузках данных.
    При установке признака использования итогов производится пересчет всех итогов».

    Запись в регистры 1С больших наборов записей действительно имеет некоторые особенности, но она вполне осуществима. В затруднительных случаях изложенные выше способы, такие как:

    • запись несколькими порциями;
    • запись вне транзакции;
    • перевод базы в монопольный режим;
    • установка управляемой исключительной блокировки на весь регистр;
    • отключение использования итогов

    помогут решить поставленную задачу. Применение каждого из способов следует сообразовывать с имеющимися реалиями конкретной базы и организации работы комплекса, использующего платформу 1С:Предприятие 8.

    ГК Трейд Софт, Москва