|
|||
ЕлАнКо
23.12.13 — 11:09 |
Добрый день! |
||
shuhard
1 — 23.12.13 — 11:10 |
(0) в общем случае ни как |
||
х86
2 — 23.12.13 — 11:10 |
(0)такой ерундой лучше не заниматься, переделайте алгоритм |
||
ЕлАнКо
3 — 23.12.13 — 11:15 |
(2) с удовольствием бы переделала, но не знаю как. Данные передаются с другой базы, ссылку не передашь, можно только для дока передать номер, дату, представление. Может как-то можно синоним вытащить? |
||
Maxus43
4 — 23.12.13 — 11:17 |
в базах документы одинаковые по дате номеру? а Уид разный? |
||
mikecool
5 — 23.12.13 — 11:18 |
(3) передай номер и дату, + вид |
||
SUA
6 — 23.12.13 — 11:18 |
>>можно только для дока передать номер, дату, представление |
||
Wobland
7 — 23.12.13 — 11:18 |
(3) вид документа тоже можно передать |
||
Necessitudo
8 — 23.12.13 — 11:20 |
УИД передавай или некую общую строку вида Номер+»;»+Дата -а потом по «;» легко распарсишь сию строку. |
||
Serg_1960
9 — 23.12.13 — 11:30 |
Было, было однажды v8: Можно ли получить обьект по текстовому виду ссылки? с 37 поста и далее. PS: +1 к «такой ерундой лучше не заниматься, переделайте алгоритм» |
||
ЕлАнКо
10 — 23.12.13 — 12:15 |
(9) На первый взгляд, это то, что нужно. Буду пробовать, спасибо |
||
ЕлАнКо 11 — 23.12.13 — 12:15 |
Всем спасибо, варианты есть, буду пробовать. |
Часто в служебном сообщении получаем текст с представлениями документов, которые хотелось тут же открыть.
Копируем текст сообщения в буфер (ctrl+A, ctrl+C), затем открываем предложенную обработку, получаем из буфера список документов. Всё!
Никаких предварительных форматирований текста не нужно.
Наверное, каждый сталкивался с ситуацией, когда нужно найти документ, того хуже — несколько документов по их представлению.
Классический порядок действий: открываем список документов, фильтруем по номеру или по дате… ищем нужный документ, ага… нашли… открываем. А если разного вида документы… то для каждого вида открываем список документов и т.д.
Теряем драгоценные секунды.
Данная обработка поможет сохранить эти секунды, а то и полуминуты или даже минуты.
Обработка позволяет из произвольного текста вытащить список представлений документов. Этот текст нужно скопировать в буфер (Ctrl+C) а затем с помощью кнопки «Заполнить из буфера обмена» заполняем список представлений документов.
Даже если есть необходимость программно обрабатывать БОЛЬШОЕ количество документов (их представлений) для поиска ссылок на них, то эта обработка окажет верную помощь, так как алгоритм поиска ссылок оптимизирован и выполняется с большой скоростью.
В модуле обработки содержатся две необходимые экспортные функции, в одну из которых можно запулить массив представлений и на выходе получить таблицу с колонками: Ссылка, Представление. Вот эти функции:
1. Для поиска одной ссылки:
Функция НайтиДокументПоПредставлению(ПредставлениеДокумента) Экспорт
2. Для поиска нескольких ссылок по массиву представлений:
Функция НайтиДокументыПоПредставлениям(Представления) Экспорт
Есть возможность использования кэширования, когда известно, что представления могут повторяться много раз при вызове функций поиска ссылки. Для этого нужно установить реквизит обработки КэшироватьПредставленияДокументов = Истина.
Обработка на Infostart’e, конечно, не уникальна, но история вопроса такова, что мне нужно было обрабатывать кучу представлений документов и искать по ним ссылки, и чтобы все работало быстро, и чтобы могла работать как внешняя обработка в конвертации данных.
Поискав на инфостарте, нашел работы на эту тему, но все как-то медленно работало.
Добавлена функция получения массива представлений из произвольного текста:
Функция НайтиПредставленияДокументов(Текст, ОписанияМетаданных = Неопределено) Экспорт
<?php // Полная загрузка сервисных книжек, создан 2023-01-05 12:44:55
global $wpdb2;
global $failure;
global $file_hist;
///// echo '<H2><b>Старт загрузки</b></H2><br>';
$failure=FALSE;
//подключаемся к базе
$wpdb2 = include_once 'connection.php'; ; // подключаемся к MySQL
// если не удалось подключиться, и нужно оборвать PHP с сообщением об этой ошибке
if (!empty($wpdb2->error))
{
///// echo '<H2><b>Ошибка подключения к БД, завершение.</b></H2><br>';
$failure=TRUE;
wp_die( $wpdb2->error );
}
$m_size_file=0;
$m_mtime_file=0;
$m_comment='';
/////проверка существования файлов выгрузки из 1С
////файл выгрузки сервисных книжек
$file_hist = ABSPATH.'/_1c_alfa_exchange/AA_hist.csv';
if (!file_exists($file_hist))
{
///// echo '<H2><b>Файл обмена с сервисными книжками не существует.</b></H2><br>';
$m_comment='Файл обмена с сервисными книжками не существует';
$failure=TRUE;
}
/////инициируем таблицу лога
/////если не существует файла то возврат и ничего не делаем
if ($failure){
///включает защиту от SQL инъекций и данные можно передавать как есть, например: $_GET['foo']
///// echo '<H2><b>Попытка вставить запись в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>$m_comment));
wp_die();
///// echo '<H2><b>Возврат в начало.</b></H2><br>';
return $failure;
}
/////проверка лога загрузки, что бы не загружать тоже самое
$masiv_data_file=stat($file_hist); ////передаем в массив свойство файла
$m_size_file=$masiv_data_file[7]; ////получаем размер файла
$m_mtime_file=$masiv_data_file[9]; ////получаем дату модификации файла
////создаем запрос на получение последней удачной загрузки
////выбираем по штампу времени создания (редактирования) файла загрузки AA_hist.csv, $m_mtime_file
///// echo '<H2><b>Размер файла: '.$m_size_file.'</b></H2><br>';
///// echo '<H2><b>Штамп времени файла: '.$m_mtime_file.'</b></H2><br>';
///// echo '<H2><b>Формирование запроса на выборку из лога</b></H2><br>';
////препарируем запрос
$text_zaprosa=$wpdb2->prepare("SELECT * FROM `vin_logs` WHERE `last_mtime_upload` = %s", $m_mtime_file);
$results=$wpdb2->get_results($text_zaprosa);
if ($results)
{ foreach ( $results as $r)
{
////если штамп времени и размер файла совпадают, возврат
if (($r->last_mtime_upload==$m_mtime_file) && ($r->last_size_upload==$m_size_file))
{////echo '<H2><b>Возврат в начало, т.к. найдена запись в логе.</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>$m_mtime_file,'last_size_upload'=>$m_size_file,'comment'=>'Загрузка отменена, новых данных нет, т.к. найдена запись в логе.'));
wp_die();
return $failure;
}
}
}
////если данные новые, пишем в лог запись о начале загрузки
/////echo '<H2><b>Попытка вставить запись о начале загрузки в лог таблицу</b></H2><br>';
$insert_fail_zapros=$wpdb2->insert('vin_logs', array('time_stamp'=>time(),'last_mtime_upload'=>0, 'last_size_upload'=>$m_size_file, 'comment'=>'Начало загрузки'));
////очищаем таблицу
$clear_tbl_zap=$wpdb2->prepare("TRUNCATE TABLE %s", 'vin_history');
$clear_tbl_zap_repl=str_replace("'","`",$clear_tbl_zap);
$results=$wpdb2->query($clear_tbl_zap_repl);
///// echo '<H2><b>Очистка таблицы сервисных книжек</b></H2><br>';
if (empty($results))
{
///// echo '<H2><b>Ошибка очистки таблицы книжек, завершение.</b></H2><br>';
//// если очистка не удалась, возврат
$failure=TRUE;
wp_die();
return $failure;
}
////загружаем данные
$table='vin_history'; // Имя таблицы для импорта
//$file_hist Имя CSV файла, откуда берется информация // (путь от корня web-сервера)
$delim=';'; // Разделитель полей в CSV файле
$enclosed='"'; // Кавычки для содержимого полей
$escaped='
Related Posts
- Восстановление последовательности документов при закрытии месяца в Бухгалтерия 3.0 не завершается
- Заполнение табличных частей
- Формирование сводных актов выполненных работ
- Ввод поступления в переработку на основании передачи сырья (между организациями)
- Конспект по установке сервера 1С на linux
- Получение имени компьютера и его IP локально и в терминале
10 Comments
-
Если в представлении документа в скобках прописан вид операции, то так понимаю, такой документ не идентифицируется?
Reply ↓
-
(1) Можете строку с таким документом показать, пожалуйста?
Может получиться так, что найдется. Если синоним документа присутствует в представлении документа, то он, поочерёдно прикладывая синонимы из метаданных определит вид документа. Правда, могут возникнуть трудности потом с нахожденеим номера. Напишите мне свою электропочту в личку — я скину вам обработку — протестируем.
Reply ↓
-
(2)paulpit@yandex.ru пока не могу найти, но помню раньше встречал вид операции в представлении документа.
Еще не смогли найти Счет-фактура выданный на аванс NNNNN (А) от 31.03.2018 23:59:59
(А) — мешается.
Reply ↓
-
(3) есть подозрение, что это номер видоизменяется. То есть в форме номер — синтетический, а-ля «НомерДок». А реальный номер документа NNNNN (А) с видимостью 0
отправил на почту.
Reply ↓
-
(4) Постфикс (А) — это требование законодательства по НДС.
Reply ↓
-
(5) Или ото https://its.1c.ru/db/v8312doc#bookmark:dev:TI000000279:
ДокументМенеджер.<Имя документа>.ОбработкаПолученияПредставления (DocumentManager.<Имя документа>.PresentationGetProcessing)
ДокументМенеджер.<Имя документа> (DocumentManager.<Имя документа>)
ОбработкаПолученияПредставления (PresentationGetProcessing)
Синтаксис:
ОбработкаПолученияПредставления(<Данные>, <Представление>, <СтандартнаяОбработка>)
Параметры:
<Данные>
Тип: Структура.
Содержит значения полей, из которых формируется представление.
<Представление>
Тип: Строка.
Строка, в которую нужно поместить представление объекта или ссылки.
<СтандартнаяОбработка>
Тип: Булево.
В данный параметр передается признак формирования стандартного представления объекта или ссылки.
Если в теле процедуры-обработчика установить данному параметру значение Ложь, стандартная обработка события производиться не будет.
Значение по умолчанию: Истина.
Описание:
Вызывается при получении представления объекта или ссылки.
Замечание:
Безопасный режим на время исполнения данного обработчика будет отключен. Данное замечание не относится к обработчикам событий, расположенным в расширении конфигурации.
Показать
Если так — то ещё не понятно, что лучше написать — свой костыль по получению номера для каждого типа документов, где стандартное представление изменено, или заморочиться на универсальность, что, на мой взгляд, не стоит затраченных усилий и результата
Reply ↓
-
Сформировал отчет дебиторская задолженность по срокам долга. Скормил обработке список из отчета, но документы не определились — пишет «строка не выглядит ка представление документа»
Идея отчета очень интересная и нужная.
Может я что-то делаю не так?
УТ11.4.3.174
Реализация товаров и услуг ДНТА-000584 от 19.07.2016 20:33:07, 19.07.2016 20:33:07
Реализация товаров и услуг ДНТА-000622 от 28.07.2016 16:00:46, 28.07.2016 16:00:46
Реализация товаров и услуг ДНТА-000687 от 16.08.2016 20:04:34, 16.08.2016 20:04:34
Реализация товаров и услуг ДНТА-000741 от 01.09.2016 18:52:31, 01.09.2016 18:52:31
Реализация товаров и услуг ДНТА-000805 от 15.09.2016 21:28:45, 15.09.2016 21:28:45
Reply ↓
-
Если подать в виде Реализация товаров и услуг ДНТА-000584 от 19.07.2016 20:33:07 — то тогда определяется документ. Но теряется смысл обработки. Как можно обойти все, что после запятой?
Reply ↓
-
Изменили в отчеты формат вывода — вроде стало получаться. Жизненно необходима фича
1. Убрать первые символы в строке в количестве N штук
2. Убрать последние символы в строке в количестве N штук
Reply ↓
-
(9) добрый день. Таки да. Строка первоначально не выглядела как представление документа. Он бы вам ничего не нашел. Обычно есть способ вывести только регистратор. Если он вывел дополнительно дату через запятую, то в настройках отчёта можно попросить не выводить реквизиты в отдельной колонке. Либо сформировать отчёт без поля дата. Код обработки расписан очень подробно и вашу просьбу вы можете легко дописать самостоятельно в одну строчку кода, либо подготовить данные в excel. Я учту ваши пожелания, если соберусь переписывать обработку для получения документов с кастомным представлением. Спасибо.
Reply ↓
Leave a Comment
Ваш адрес email не будет опубликован. Обязательные поля помечены *
+1
Как из строки Представления Документа получить его Номер и Дату?
// Функция преобразовывает строку
// вида: "Введен на основании: Счет на оплату № 000415 от 30 июня 2008 г."
// и возвращает массив содержащий название документа, номер и дату
Функция РазбитьСтрокуДокументаНаНомерИДату(Стр)
Симв1 = Найти(Стр,":");
Симв2 = Найти(Стр,"№");
Симв3 = Найти(Стр,"от");
РезМассив = Новый Массив;
РезМассив.Добавить(СокрЛП(Сред(Стр,Симв1+1, Симв2-Симв1-1)));
РезМассив.Добавить(СокрЛП(Сред(Стр,Симв2+1, Симв3-Симв2-1)));
РезМассив.Добавить(СокрЛП(Сред(Стр,Симв3+2, СтрДлина(Стр)-Симв3)));
Возврат РезМассив;
КонецФункции
//Пример обращения
Реквизит1 = "Введен на основании: Счет на оплату № 000415 от 30 июня 2008 г.";
МассивСДанными = РазбитьСтрокуДокументаНаНомерИДату(Реквизит1);
Сообщить("Документ - "+МассивСДанными[0]);
Сообщить("Номер - "+МассивСДанными[1]);
Сообщить("Дата - "+МассивСДанными[2]);
// Результат Будет
// Документ - Счет на оплату
// Номер - 000415
// Дата - 30 июня 2008 г.
Код 1C v 7.x
// Функция преобразовавает строку
// вида: "Введен на основании: Счет на оплату № 000415 от 30 июня 2008 г."
// и возвращает массив содержащий название документа, номер и дату
Функция РазбитьСтрокуДокументаНаНомерИДату(Стр)
Симв1 = Найти(Стр,":");
Симв2 = Найти(Стр,"№");
Симв3 = Найти(Стр,"от");
Список = СоздатьОбъект("СписокЗначений");
Список.ДобавитьЗначение(СокрЛП(Сред(Стр,Симв1+1, Симв2-Симв1-1)));
Список.ДобавитьЗначение(СокрЛП(Сред(Стр,Симв2+1, Симв3-Симв2-1)));
Список.ДобавитьЗначение(СокрЛП(Сред(Стр,Симв3+2, СтрДлина(Стр)-Симв3)));
Возврат Список;
КонецФункции
//*******************************************
Процедура Сформировать()
Реквизит1 = "Введен на основании: Счет на оплату № 000415 от 30 июня 2008 г.";
СпЗсДанными = РазбитьСтрокуДокументаНаНомерИДату(Реквизит1);
Сообщить("Документ - "+ СпЗсДанными.ПолучитьЗначение(1));
Сообщить("Номер - "+ СпЗсДанными.ПолучитьЗначение(2));
Сообщить("Дата - "+ СпЗсДанными.ПолучитьЗначение(3));
КонецПроцедуры
В статье приводятся практические примеры работы с документами в языке 1С. Рассматриваются приемы работы с объектной моделью – создание, редактирование, удаление документов, а также типовые запросы для выборки документов по различным условиям. Для удобства пользуйтесь оглавлением.
Содержание
Немного о документах
Документы – краеугольный камень в построении большинства учетных систем средствами платформы 1С Предприятие. Они предназначены преимущественно для отражения совершенных хозяйственных операций, а также для последующего просмотра и редактирования.
Виды документов, которые создаются в конфигураторе на этапе проектирования прикладного решения, в основном соответствуют своим бумажным аналогам – приходным накладным, документам продажи или актам об оказании услуг, и др. Для каждой отрасли и вида учета набор таких документов и их реквизитный состав может отличаться.
Помимо записи о произошедшей хозяйственной операции, документы используются для фиксации изменений в учетных регистрах (т.н. проведение), а также позволяют сформировать печатные формы. Вообще, спектр применения документов в платформе 1С очень обширный, и позволяет реализовывать самые различные механизмы – биллинг, учет коммунальных платежей, сложные расчеты, учет ценных бумаг и активов, и многое другое.
Документы описываются в системе 1С двумя стандартными реквизитами – Номер и Дата. Использование номера не является обязательным – можно указать длину номера 0, и в этом случае платформа отключит механизм нумерации документов. В этом случае разработчик может сам предусмотреть реквизиты для формирования представления документа и для проверки уникальности. Но на практике чаще всего номер не отключается.
Как выбрать и отсортировать документы за период в 1С 8
// Получим список всех заказов за 2021 год и отсортируем их по возрастанию даты
Запрос = Новый Запрос("ВЫБРАТЬ
| Заказ.Ссылка КАК Ссылка,
| ПРЕДСТАВЛЕНИЕ(Заказ.Ссылка) КАК ПредставлениеДокумента
|ИЗ
| Документ.Заказ КАК Заказ
|ГДЕ
| Заказ.Дата МЕЖДУ &ДатаНачала И &ДатаОкончания
|
|УПОРЯДОЧИТЬ ПО
| Заказ.Дата");
Запрос.УстановитьПараметр("ДатаНачала", '20210101');
// Указать дату без уточнения времени недостаточно,
// т.к. тогда не попадут документы за последний день периода
Запрос.УстановитьПараметр("ДатаОкончания", '20211231235959');
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Сообщить("Нет документов за указанный период");
Возврат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
// Для вывода информации на экран достаточно использовать представление.
Сообщить(Выборка.ПредставлениеДокумента);
КонецЦикла;
Как найти документ по номеру в 1с 8.3
Следует учитывать, что у документа должен быть не нулевой код. В случае указания интервала больше года, в результат запроса могут попасть несколько документов с одинаковым номером за разные периоды. Следует либо указывать интервалы в пределах одного календарного года, либо задать документу сплошную непериодическую нумерацию.
// найдём заказ № УТ-000001 за 2021 год
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Заказ.Ссылка КАК Ссылка,
| ПРЕДСТАВЛЕНИЕ(Заказ.Ссылка) КАК ПредставлениеДокумента
|ИЗ
| Документ.Заказ КАК Заказ
|ГДЕ
| Дата МЕЖДУ &ДатаНачала И &ДатаОкончания И
| Номер = &НомерДляПоиска";
Запрос.УстановитьПараметр("ДатаНачала", '20210101');
Запрос.УстановитьПараметр("ДатаОкончания", '20211231235959');
Запрос.УстановитьПараметр("НомерДляПоиска", "УТ-000001");
РезультатЗапроса = Запрос.Выполнить();
ВыборкаДокументов = РезультатЗапроса.Выбрать();
Если ВыборкаДокументов.Следующий() Тогда
Сообщить(ВыборкаДокументов.ПредставлениеДокумента);
Иначе
Сообщить("Документ с таким номером отсутствует!");
КонецЕсли;
Как найти документы по реквизиту в 1с 8
// Найдем все заказы от покупателя "Частное лицо"
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Заказ.Ссылка КАК Ссылка,
| ПРЕДСТАВЛЕНИЕ(Заказ.Ссылка) КАК ПредставлениеДокумента
|ИЗ
| Документ.Заказ КАК Заказ
|ГДЕ
| Покупатель = &Покупатель";
// В примере Частное лицо - предопределенный элемент справочника Контрагеты
Запрос.УстановитьПараметр("Покупатель", Справочники.Контрагенты.ЧастноеЛицо);
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Сообщить("Нет документов за указанный период");
Возврат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.ПредставлениеДокумента);
КонецЦикла;
Как выбрать все не проведенные документы, которые не помечены на удаление в 1с 8
Начинающие разработчики часто ошибочно пишут, используя передачу параметра с типом Булево.
|ГДЕ
| Заказ.Проведен = &Проведен"
Запрос.УстановитьПараметр("Проведен", Истина);
Этот код будет корректным с точки зрения синтаксиса и платформы, но это признак недостаточного знания языка запросов и умения составлять текст запросов. В данном случае правильнее просто написать
|ГДЕ
| Не Заказ.Проведен"
// найдём не проведенные и не помеченные на удаление документы заказов
Запрос = Новый Запрос;
Запрос.Текст =
"ВЫБРАТЬ
| Заказ.Ссылка КАК Ссылка,
| ПРЕДСТАВЛЕНИЕ(Заказ.Ссылка) КАК ПредставлениеДокумента
|ИЗ
| Документ.Заказ КАК Заказ
|ГДЕ
| НЕ Заказ.Проведен
| И НЕ Заказ.ПометкаУдаления
|
|УПОРЯДОЧИТЬ ПО
| Заказ.Дата";
РезультатЗапроса = Запрос.Выполнить();
Если РезультатЗапроса.Пустой() Тогда
Сообщить("Нет документов за указанный период");
Возврат;
КонецЕсли;
Выборка = РезультатЗапроса.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(Выборка.ПредставлениеДокумента);
КонецЦикла;
Как обойти (перебрать) все строки табличной части документа в 1С 8
// Переберем все строки документа Заказ с номером УТ-000001
// У документа заказ есть табличная часть Спецификация с колонками
// Товар, Количество, Сумма
НайденныйЗаказ = Документы.Заказ.НайтиПоНомеру("УТ-000001", '20210101');
Если ЗначениеЗаполнено(НайденныйЗаказ) Тогда
Для Каждого СтрокаСпецификации Из НайденныйЗаказ.Спецификация Цикл
Сообщить(СтрШаблон("Товар % 1, количество %2 шт, сумма %3 руб.",
СтрокаСпецификации.Товар,
СтрокаСпецификации.Количество,
СтрокаСпецификации.Сумма));
КонецЦикла;
КонецЕсли;
Создание и редактирование документов в языке 1С 8
Как создать новый документ в 1С программно
// Создадим новый документ Заказ средствами языка 1С
Заказ = Документы.Заказ.СоздатьДокумент();
Заказ.Дата = ТекущаяДата();
//Далее заполним реквизиты шапки
//Здесь - вместо пустой ссылки можно передать реквизит формы, переменную и т.д.
ВыбранныйПокупатель = Справочники.Контрагенты.ПустаяСсылка();
Заказ.Покупатель = ВыбранныйПокупатель;
//Далее - заполняется табличная часть.
СтрокаТЧ = Заказ.Спецификация.Добавить();
СтрокаТЧ.Товар = Товар;
СтрокаТЧ.Количество = 10;
СтрокаТЧ.Сумма = 100;
Как записать документ в 1С 8
У всех документов в языке 1С есть метод Записать, у которого есть два необязательных параметра: РежимЗаписи и РежимПроведения. РежимПроведения имеет смысл только если мы явным образом вызываем проведение документа.
Вызов метода без параметров равносилен вызову с режимом “Запись”
Заказ.Записать();
Заказ.Записать(РежимЗаписиДокумента.Запись);
Как провести документ средствами языка 1С 8
Следует иметь в виду, что если у документа свойство Проведение установлено в значение “Запретить”, попытка записать документ с режимом записи “Проведение” приведет к ошибке.
Заказ.Записать(РежимЗаписиДокумента.Проведение);
Как отменить проведение документа в 1С 8
Заказ.Записать(РежимЗаписиДокумента.ОтменаПроведения);
Как внести изменения в документ по ссылке в 1с 8
Если нам нужно отредактировать документ, который уже записан в базу данных, чаще всего мы имеем в распоряжении ссылку на этот объект, полученную тем или иным образом. Например, ссылка может содержаться в значении реквизита формы, в переменной, или в текущих данных строки, если мы находимся в списке документов, и выделяем мышкой конкретную строку.
Ссылка позволяет считывать свойства документа, а для редактирования нужен сам объект. Для этого следует использовать метод ПолучитьОбъект().
//Найдем ссылку на заказ, используя объектную модель представления данных
НайденныйЗаказ = Документы.Заказ.НайтиПоНомеру("УТ-000001");
// вот так можно проверить, что документ не найден в системе
Если НайденныйЗаказ.Пустая() Тогда
Сообщить("Документ отсутствует в базе");
Иначе
//Получаем документ по ссылке
ОбъектЗаказ = НайденныйЗаказ.ПолучитьОбъект();
ОбъектЗаказ.Комментарий = "Мы нашли и отредактировали существующий документ";
ОбъектЗаказ.Записать();
КонецЕсли;
Как получить пустую ссылку на документ в 1С 8
ПустаяСсылка = Документы.Заказ.ПустаяСсылка();
Как программно заблокировать документ перед изменениями в 1С 8
//Установим блокировку документа от изменения
ЗаказОбъект = НайденныйЗаказ.ПолучитьОбъект();
Попытка
//Заблокируем по ссылке
ЗаблокироватьДанныеДляРедактирования(НайденныйЗаказ);
Исключение
Сообщить("Документ уже заблокирован!";
Возврат;
КонецПопытки;
ЗаказОбъект.Комментарий = "Произвели какие-то длительные действия по изменению документа";
ЗаказОбъект.Записать();
//а разблокируем при помощи метода объекта
ЗаказОбъект.Разблокировать();
Как средствами языка 1С ввести документ на основании другого
Для полноценного ввода на основании другого документа, в дочернем документе должна быть реализована процедура ОбработкаЗаполнения, которая отвечает за алгоритм заполнения. Для связи документа-основания и дочернего документа чаще всего заводится реквизит ДокументОснование. Если связь реализуется один ко многим, как это сделано во многих типовых решениях, то для этого создается табличная часть ДокументыОснования. Ниже рассмотрен простой пример ввода счета на основании заказа.
НайденныйЗаказ = Документы.Заказ.НайтиПоНомеру("УТ-000001");
СчетНаОсновании = Документы.Счет.СоздатьДокумент();
//Вот здесь вызывается процедура ОбработкаЗаполнения
СчетНаОсновании.Заполнить(НайденныйЗаказ);
СчетНаОсновании.Комментарий = "Документ введен программно на основании " + НайденныйЗаказ;
СчетНаОсновании.Записать();
Работа с движениями документа средствами языка 1С
Как прочитать движения документа запросом
// Прочитаем движения документа по регистру ЗаказыКлиентов при помощи запроса
НайденныйЗаказ = Документы.Заказ.НайтиПоНомеру("УТ-000001");
Запрос = Новый Запрос("ВЫБРАТЬ
| ЗаказыКлиентов.НомерСтроки КАК НомерСтроки,
| ЗаказыКлиентов.ВидДвижения КАК ВидДвижения,
| ЗаказыКлиентов.Товар КАК Товар
| ЗаказыКлиентов.Количество КАК Количество
|ИЗ
| РегистрНакопления.ЗаказыКлиентов КАК ЗаказыКлиентов
|ГДЕ
| ЗаказыКлиентов.Регистратор = &НайденныйЗаказ");
Запрос.УстановитьПараметр("НайденныйЗаказ", НайденныйЗаказ);
Результат = Запрос.Выполнить();
// Преимущество запросов в том, что можно получать
// не все движения, а с учетом отборов, или только по некоторым полям
Если Не Результат.Пустой() Тогда
Выборка = Результат.Выбрать();
Пока Выборка.Следующий() Цикл
Сообщить(
"№ " + Выборка.НомерСтроки +
"ВидДвижения" + Выборка.ВидДвижения +
"Товар " + Выборка.Товар +
"Количество " + Выборка.Количество
);
КонецЦикла;
КонецЕсли;
Чтение и редактирование движений документа в 1С с использованием объектной модели
// Найдем и изменим движения документа по регистрам программно
НайденныйЗаказ = Документы.Заказ.НайтиПоНомеру("УТ-000001");
// В нашем примере заказ делает движения по двум регистрам:
// регистр накопления - резервы товаров
// регистр накопления - заказы клиентов
// для редактирования движений документа используем объектный подход
// и коллекцию Движения, предварительно получив документ.
ДвиженияДокумента = НайденныйЗаказ.ПолучитьОбъект().Движения;
// в коллекции хранятся наборы записей документа в регистры
// поместим набор записей в переменную
НаборЗаписей = ДвиженияДокумента.ЗаказыКлиентов;
// Прочитаем записи из набора данных
// Если этого не сделать, то при записи набор данных заменится только новым содержимым
НаборЗаписей.Прочитать();
Для Каждого Запись Из НаборЗаписей Цикл
// выведем старые значения
Сообщить(Строка(Запись.ВидДвижения) + " " + Запись.Товар + " " + Запись.Количество);
// отредактируем запись, например укажем вид движения Расход
Запись.ВидДвижения = ВидДвиженияНакопления.Расход;
КонецЦикла;
//Добавим новую запись в набор
ЗаписьПриход = НаборЗаписей.ДобавитьПриход();
ЗаписьПриход.Товар = Справочники.Товары.НайтиПоНаименованию("Авторучка");
ЗаписьПриход.Количество = 5;
ЗаписьПриход.Период = НайденныйЗаказ.Дата;
// Удалим старые движения и вместо них запишем новые.
НаборЗаписей.Записать(Истина);
// Движения документа Заказ № УТ-000001 теперь отличаются
// от сформированных при проведении.
// Чтобы вернуть исходные движения, документ нужно перепровести
Как отредактировать проведенный документ, не меняя движений
Ситуация, обратная рассмотренной выше – нужно изменить документ, не трогая движения. Такая необходимость иногда возникает, если отчетный период закрыт, движения документов должны быть гарантировано неизменными, но в сами документы необходимо внести изменения.
НайденныйЗаказ = Документы.Заказ.НайтиПоНомеру("УТ-000001");
ЗаказОбъект = НайденныйЗаказ.ПолучитьОбъект();
ЗаказОбъект.Комментарий = "Отредактируем документ, не трогая движения";
// В различных конфигурациях при записи объекта может быть реализованы
// алгоритмы, которые могут вызвать перепроведение.
// Чаще всего предусмотрен механизм отключения этих алгоритмов при загрузке
ЗаказОбъект.ОбменДанными.Загрузка = Истина;
// явным образом укажем, что документ необходимо только записать
ЗаказОбъект.Записать(РежимЗаписиДокумента.Запись);
Работа с формами документов средствами языка 1С 8
Открыть форму документа по ссылке
// Найдем заказ по номеру с учетом года
НайденныйЗаказ = Документы.Заказ.НайтиПоНомеру("УТ-000001",'20211231');
ПараметрыФормы = Новый Структура("Ключ", НайденныйЗаказ);
//Можно открыть форму объект по умолчанию
ОткрытьФорму(
"Документ.Заказ.ФормаОбъекта", // имя формы
ПараметрыФормы // параметры для формы
);
// Либо указать конкретную форму документа
ОткрытьФорму("Документ.Заказ.Форма.ФормаДокумента", ПараметрыФормы);
Открыть форму списка документов с отбором по реквизиту
// откроем список заказов, оставив
// только те, что от покупателя ЧастноеЛицо
ПараметрыОтбора = Новый Структура;
ПараметрыОтбора.Вставить("Покупатель", Справочники.Контрагенты.ЧастноеЛицо);
ПараметрыФормы = Новый Структура;
ПараметрыФормы.Вставить("Отбор", ПараметрыОтбора);
ОткрытьФорму("Документ.Заказ.ФормаСписка", ПараметрыФормы);
Открыть форму выбора документа и отследить событие закрытия формы
В клиентском модуле, откуда мы хотим вызвать открытие формы выбора, пишем следующий код:
// Чтобы отследить закрытие формы выбора, нам понадобится обработка оповещения
// Это отдельная экспортная процедура в том модуле, откуда мы вызываем открытие формы
ОповещениеОЗакрытии = Новый ОписаниеОповещения("ОбработкаВыбораДокумента",
ЭтотОбъект);
ОткрытьФорму("Документ.Заказ.ФормаВыбора",,,,,,ОповещениеОЗакрытии);
И добавляем отдельную процедуру для обработки:
&НаКлиенте
Процедура ОбработкаВыбораДокумента(Результат, Параметры) Экспорт
Если Результат <> Неопределено Тогда
Сообщить("Был выбран документ " + Результат);
КонецЕсли;
КонецПроцедуры
Как открыть форму нового документа, созданного программно
Бывают ситуации, когда нужно создать документ, заполнить его данными, но не записывая, показать пользователю. Например, для проверки и дальнейшего редактирования. Это можно сделать при помощи следующего кода:
&НаКлиенте
Процедура ОткрытьФормуНового(Команда)
ФормаНовогоДокумента = ПолучитьФорму("Документ.Счет.ФормаОбъекта");
//Копируем объект, т.к. напрямую данные формы менять нельзя
ДанныеФормы = ФормаНовогоДокумента.Объект;
//Полученный экземпляр заполняем на сервере
ЗаполнитьНовыйДокументНаСервере(ДанныеФормы);
// Заполненные данные нужно скопировать в исходную форму
КопироватьДанныеФормы(ДанныеФормы, ФормаНовогоДокумента.Объект);
// покажем форму нового документа пользователю
ФормаНовогоДокумента.Открыть();
КонецПроцедуры
&НаСервере
Процедура ЗаполнитьНовыйДокументНаСервере(ДанныеФормы)
Счет = ДанныеФормыВЗначение(ДанныеФормы, Тип("ДокументОбъект.Счет"));
Счет.Дата = НачалоМесяца(ТекущаяДата());
Счет.Комментарий = "Документ создан программно, открываем без записи";
//Преобразуем объект обратно в данные формы
ЗначениеВДанныеФормы(Счет, ДанныеФормы);
КонецПроцедуры