1С 8.2-8.3. Создать на основании новый документ или открыть существующий.

15.05.14

Разработка - Механизмы платформы 1С

1С 8.2-8.3 Ввод документа на основании. Если такой документ уже создан, то открыть существующий.

Условие задачи: В конфигурацию добавлен документ , который должен заполняться на основании другого документа, например, "Реализация товаров и услуг". Причем, создан на основании может быть только один документ.

Собственно задача: Используя типовой "Ввод на основании" создать новый документ. Если таковой уже создан, то открыть существующий. Как вариант, открыть не сам документ, а форму списка с позиционированием на нем.

Готового решения не сумел найти. Может плохо искал. В типовой Бухгалтерии 3.0, например, при попытке ввести "Счет-фактуру выданный" на основании РТиУ при уже существующем, вызывается исключение и просто выдается сообщение о том, что таковой уже есть.

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

В модуле формы заполняемого документа (СборкаПродукции) использую событие формы документа "ПриОткрытии":

&НаКлиенте
Процедура ПриОткрытии(Отказ)
    ДокСсылка = ПриОткрытииНаСервере();
    Если ДокСсылка <> 0 Тогда
        Отказ = Истина;
        ОткрытьЗначение(ДокСсылка);
        //Если нужно открыть не сам документ, а список с позиционированием на документе, то пред. строку заменить на:
        //ДопПараметры = Новый Структура("ТекущаяСтрока", ДокСсылка);
        //ОткрытьФорму("Документ.СборкаПродукции.ФормаСписка", ДопПараметры);        
    КонецЕсли;
КонецПроцедуры

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

Собственно все.

Прошу сильно не ругать - это моя первая публикация. За поправки и подсказки буду благодарен.

 

Ввод на основании открыть существующий

См. также

Поинтегрируем: сервисы интеграции – новый стандарт или просто коннектор?

Обмен между базами 1C Администрирование СУБД Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

В платформе 8.3.17 появился замечательный механизм «Сервисы интеграции». Многие считают, что это просто коннектор 1С:Шины. Так ли это?

11.03.2024    4620    dsdred    53    

73

Как готовить и есть массивы

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

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

24.01.2024    5309    YA_418728146    25    

64

Планы обмена VS История данных

Обмен между базами 1C Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Вы все еще регистрируете изменения только на Планах обмена и Регистрах сведений?

11.12.2023    6436    dsdred    36    

112

1С-ная магия

Механизмы платформы 1С Бесплатно (free)

Язык программирования 1С содержит много нюансов и особенностей, которые могут приводить к неожиданным для разработчика результатам. Сталкиваясь с ними, программист начинает лучше понимать логику платформы, а значит, быстрее выявлять ошибки и видеть потенциальные узкие места своего кода там, где позже можно было бы ещё долго медитировать с отладчиком в поисках источника проблемы. Мы рассмотрим разные примеры поведения кода 1С. Разберём результаты выполнения и ответим на вопросы «Почему?», «Как же так?» и «Зачем нам это знать?». 

06.10.2023    18504    SeiOkami    46    

118

Дефрагментация и реиндексация после перехода на платформу 8.3.22

Механизмы платформы 1С Платформа 1С v8.3 Бесплатно (free)

Начиная с версии платформы 8.3.22 1С снимает стандартные блокировки БД на уровне страниц. Делаем рабочий скрипт, как раньше.

14.09.2023    12111    human_new    27    

74

Валидация JSON через XDTO (включая массивы)

WEB-интеграция Универсальные функции Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

При работе с интеграциями рано или поздно придется столкнуться с получением JSON файлов. И, конечно же, жизнь заставит проверять файлы перед тем, как записывать данные в БД.

28.08.2023    8849    YA_418728146    6    

141

Внешние компоненты Native API на языке Rust - Просто!

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

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

20.08.2023    6288    sebekerga    54    

94

Все скопируем и вставим! (Буфер обмена в 1С 8.3.24)

Механизмы платформы 1С Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

Рассмотрим новую возможность 8.3.24 и как её можно эффективно использовать

27.06.2023    16018    SeiOkami    31    

103
Комментарии
В избранное Подписаться на ответы Сортировка: Древо развёрнутое
Свернуть все
1. MarSeN 984 15.05.14 23:37 Сейчас в теме
Для первого опыта пойдет. Но только не для рабочих баз:
1. У Вас не предусмотрен ввод на основании программным способом. Т.е программно получится ввести дубли. Надо добавить проверку и генерировать исключение (у Вас проверки, скорее всего, нет, раз срабатывает проц. ПриОткрытии)
2. В Вашем случае ввод на основании все-равно выполняется, но не сохраняется, если есть дубль
3. ИМХО Так как Вы делаете на УФ, то правильнее выполнить данную задачу, подменив команду ввода на основании. Т.е. Стандартную команду ввода на основании скрываете и создаете свою. В модуле команды на сервере осуществляете поиск, если нет документа - создаете ч.з открытьФорму с параметром Основание, Если есть документ то тоже чз открыть форму с параметром Ключ
Jeka44; user712426; mevgenym; softcreator; e401; +5 Ответить
2. e401 30 16.05.14 12:06 Сейчас в теме
(1) MarSeN,
Понял, спасибо, учту, сделаю. Не совсем понял, как скрыть-подменить команду ввода на основании
3. MarSeN 984 17.05.14 12:06 Сейчас в теме
(2) e401,
Если команда ввода на основании создается автоматически, тогда надо в объекте Ввод на основании убрать документ, для которого хотите подменить команду на свою.
далее добавляете свою команду и реализуете то что писал выше
4. AleksSF 222 23.09.15 16:47 Сейчас в теме
Если использовать БСП, то можно еще проще.
&НаСервере
Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка)
	// СтандартныеПодсистемы.ВерсионированиеОбъектов
	ВерсионированиеОбъектов.ПриСозданииНаСервере(ЭтаФорма);
	// Конец СтандартныеПодсистемы.ВерсионированиеОбъектов	
	Если Объект.Номер = "" Тогда
		Запрос = Новый Запрос;
		Запрос.Текст = 
			"ВЫБРАТЬ
			|	СвязанныеДокументы.Ссылка
			|ИЗ
			|	КритерийОтбора.СвязанныеДокументы(&ТекущийДокумент) КАК СвязанныеДокументы";

		Запрос.УстановитьПараметр("ТекущийДокумент", Объект.Основание);
		РезультатЗапроса = Запрос.Выполнить();
		Если Не РезультатЗапроса.Пустой() Тогда
			ВыборкаДетальныеЗаписи = РезультатЗапроса.Выбрать();
			Пока ВыборкаДетальныеЗаписи.Следующий() Цикл
				Сообщение = Новый СообщениеПользователю;
				Сообщение.Текст = "Это выполнение ЗАКРЫТО " + ВыборкаДетальныеЗаписи.Ссылка;
				Сообщение.Поле = "";
				Сообщение.УстановитьДанные(ВыборкаДетальныеЗаписи.Ссылка.ПолучитьОбъект());
				Сообщение.Сообщить();
				Отказ = Истина;
			КонецЦикла;
			Возврат;
		КонецЕсли; 
		Если Объект.Основание.ДатаВыполнения <> '00010101' Тогда
			Сообщение = Новый СообщениеПользователю;
			Сообщение.Текст = "Закрывать можно только выполненную заявку";
			Сообщение.Сообщить();
			Отказ = Истина;
			Возврат;
		КонецЕсли; 
	КонецЕсли; 
	// Если документ введен на основании, то запретим редактировать основание
	Если Не Объект.Основание.Пустая() И Объект.Проведен Тогда
		Элементы.Основание.ТолькоПросмотр = Истина;
	Иначе
		Элементы.Основание.ТолькоПросмотр = Ложь;
	КонецЕсли; 
	Если Объект.Ответственный = Справочники.Пользователи.ПустаяСсылка() Тогда
		Объект.Ответственный = ПараметрыСеанса.ТекущийПользователь;
	КонецЕсли; 
КонецПроцедуры
Показать
user811769; SuhoffGV; user712426; WellMaster; +4 Ответить
5. artik1994 15.07.16 14:43 Сейчас в теме
зачем все эти заморочки из бочки???
для нас упростили жизнь и создали конструктор ввода на основании...
смиритесь и пользуйтесь с удовольствием
6. e401 30 18.07.16 07:45 Сейчас в теме
(5) artik1994,
Вы не поняли суть: Используя типовой "Ввод на основании" создать новый документ. Если таковой уже создан, то открыть существующий, а не выводить сообщение о том, что такой документ уже создан.
7. cheiser1982 210 22.06.17 06:28 Сейчас в теме
Предлагаю по этой теме посмотреть статью: http://infostart.ru/public/636444/
Для Вашего первого опыта все не плохо, просто некоторых нюансов не предусмотрено...
8. e401 30 22.06.17 10:37 Сейчас в теме
Оставьте свое сообщение