powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / [игнор отключен] [закрыт для гостей] / V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
20 сообщений из 20, страница 1 из 1
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36134638
vastok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Задача:

1. Присваивать уникальные номера документа, если номер не задан вручную.

2. Нужно при записи проверять уникальность доп. номера документа и возвращать сообщение об ошибке.

Решение:
Хочу сделать это через тригер и хранимую процедуру. С пунктом 1 проблем нет.

Есть проблема с пунктом 2: Как отменить транзакцию и вернуть в 1С ошибку так, чтоб 1С при этом не валилась?

RAISERROR ('Проба...',18,1) тупо валить 1С с невосстановимой ошибкой базы.
ROLLBACK TRANSACTION та же ошибка.
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36135996
Last1Cmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vastok, а СтатусВозврата(0) в модуле проведения не оно ?
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36136318
vastok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Last1Cmen, Не оно. Мне нужно получать некий результат при записи из SQL так, чтоб этот результат можно было обработать.
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36136512
Last1Cmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vastok, ну если обработать надо

Код: plaintext
1.
2.
3.
4.
попытка 
//запись
исключение
//обрабатываем можем даже сообщить(ОписаниеОшибки())
конецпопытки;

непонятно почему именно СКЛ должен это делать ? быстрее не будет всё равно
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36136517
Defender77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а УстановитьНовыйНомер() чем не подходит? Или с нумератором что случилось?
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36136577
vastok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Defender77,

Есть Н баз. В базах есть Док, который гарантированно должен иметь уникальный номер. Все базы лежат на одном сервере.
Есть отдельная база с таблицей вида "ИдДок|Номер"
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36137017
Last1Cmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vastok,
ну так вставь в исключение поиск по тому номеру что хочешь присвоить и если он уже есть пиши в БД новый номер и его ищи пока не найдёшь не занятый после чего записывай и выходи из попытки

зачем тут обработка срв-вами СКЛ ?! поиск по номеру быстрая вещь и в самой 1це
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36137104
pail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Решение:
1. Отдельная (не-1С) база и таблица в ней, которая отвечает за уникальность номеров. Она хранит все выданные номера, умеет проверить, занят номер или нет, и умеет создать новый номер.

Таблица хранит соответствия строк
- некий идентификатор 1С-документа, уникальный в пределах группы баз. Будет это специально генерируемый guid, или комбинация ид.базы+номерДокумента+датаДокумента, опять же, особой роли не играет.

Из 1С к ней можно обращаться через ADO (запросы, хранимые процедуры - дело вкуса)

2. В конфигурации 1С в форме документа в процедуре ПриЗаписи

если ПустаяСтрока(НомерДок)=1 тогда
НомерДок=ПрисвоитьУникальныйНомер(ИдентификаторДокумента(контекст));
иначеесли ПроверитьУникальностьНомера(НомерДок,ИдентификаторДокумента(контекст))=0 тогда
СтатусВозврата(1); // номер уже занят, причем не этим документом
конецЕсли;


Функции, использованные в п.2 - реализация того, что описано в п.1
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36137227
vastok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Last1Cmen,

ПРОЧТИ ЕЩЕ РАЗ СООБЩЕНИЕ ВЫШЕ. Есть Н баз. Какие средствами 1С. Н баз!
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36137242
vastok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pail,

Только нужно заблокировать хранилище номеров до записи текущего документа... а после записи его разблокировать.
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36137275
pail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vastokpail,

Только нужно заблокировать хранилище номеров до записи текущего документа... а после записи его разблокировать.

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

Или та ХП, которая будет из нее вызываться.
Блокировать же достаточно именно на время выделения номера.
А запись в каждую отдельную базу 1С пусть независимо идет.
Если есть сомнения в том, что транзакция записи завершится успешно, поставить приведенный код последним в событии ПриЗаписи.
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36137354
Last1Cmen
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vastok, ставить задачу конкретно надо

мол есть база не 1с с номерами док-тов которая пишет в таблицы баз 1с документы присваивая им номер из своих таблиц/таблицы... а то у тебя получается есть куча баз 1с и некая таблица в которой хранятся данные о номерах и запись док-та происходит в самой 1с с поиском номера в этой таблице

опять же с новой постановкой задачи не понимаю в чем проблема проверить уникальность номера в каждой из БД... само собой

Код: plaintext
Блокировать же достаточно именно на время выделения номера
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36137676
vastok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Last1Cmen,

И во время проверки на уникальность исправленного номера вручную.

Вот проблема заблокировать таблицу и вернуть сообщение результат, если номер не уникальный.
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36137686
vastok
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
pail,

Сомнения в том,
- что пройдет проверка
- из другой базы добавят номер
- запишится документ

Запишится докумен и получим задвоение.
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36137746
pail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vastokpail,

Сомнения в том,
- что пройдет проверка
- из другой базы добавят номер
- запишится документ

Запишится докумен и получим задвоение.

1. Проверяем, что номер еще не присвоен
2. Выделяем номер - процедура, исполняемая на сервере SQL. Со всеми необходимыми блокировками.
С ожиданием в этой же процедуре, если блокировка уже выставлена другим клиентом.
3. Присваиваем номер документу.

Если в это же время будет запрос на новый номер от другой базы - он будет создан действительно новым (см. п.2). Если же в другой базе будет попытка записать созданный вручную номер, совпадающий с только что созданным автоматически - функция
ПроверитьУникальностьНомера() должна будет сообщить о неудаче. А что при этом делать пользователю - вы уж придумайте что-нибудь самостоятельно.
Естественно, ПроверитьУникальностьНомера() должна учитывать вероятность попадания на момент создания нового номера. Проверив существование той же блокировки, например.

Я ведь примерный алгоритм предложил, как иллюстрацию принципа. Детали реализации - для Вас.
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36138259
Фотография iscrafm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vastok,

запишется
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36138661
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pailРешение:
1. Отдельная (не-1С) база и таблица в ней, которая отвечает за уникальность номеров. Она хранит все выданные номера, умеет проверить, занят номер или нет, и умеет создать новый номер.

Таблица хранит соответствия строк
- некий идентификатор 1С-документа, уникальный в пределах группы баз. Будет это специально генерируемый guid, или комбинация ид.базы+номерДокумента+датаДокумента, опять же, особой роли не играет.

Из 1С к ней можно обращаться через ADO (запросы, хранимые процедуры - дело вкуса)

2. В конфигурации 1С в форме документа в процедуре ПриЗаписи

если ПустаяСтрока(НомерДок)=1 тогда
НомерДок=ПрисвоитьУникальныйНомер(ИдентификаторДокумента(контекст));
иначеесли ПроверитьУникальностьНомера(НомерДок,ИдентификаторДокумента(контекст))=0 тогда
СтатусВозврата(1); // номер уже занят, причем не этим документом
конецЕсли;


Функции, использованные в п.2 - реализация того, что описано в п.1
Что будет, при программном создании документа обработкой?
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36138816
pail
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
HoBTID
Что будет, при программном создании документа обработкой?

Ничего не будет - если не сделать то же самое и в обработке. Такова семерка.
Однако:
1. в описании задачи шла речь о ручном присвоении номеров - т.е. через форму, а не программным созданием документа.
2. Обработки программного создания документов сами собой не создаются, и в обычных конфигурациях, как правило, не встречаются. Нет проблем с тем, чтобы, создав и эксплуатируя такую обработку, учесть в ней и такой момент, как особенности назначения номеров для отдельно взятого вида документа.
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36139192
VoditelKobyly
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А как предполагается решить следующую проблему:
В 1с форма документа открывается и в ней уже есть номер. Документ может иметь какие-то печатные формы. А в конце разного рода манипуляций документ не сохраняется.
В этот момент другая программа запросила и получила следующий номер.
В нумерации появилась дырка. Это допустимо?
...
Рейтинг: 0 / 0
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
    #36139463
HoBTID
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
pailHoBTID
Что будет, при программном создании документа обработкой?

Ничего не будет - если не сделать то же самое и в обработке. Такова семерка.
Однако:
1. в описании задачи шла речь о ручном присвоении номеров - т.е. через форму, а не программным созданием документа.
2. Обработки программного создания документов сами собой не создаются, и в обычных конфигурациях, как правило, не встречаются. Нет проблем с тем, чтобы, создав и эксплуатируя такую обработку, учесть в ней и такой момент, как особенности назначения номеров для отдельно взятого вида документа.
1. Через форму - тогда ОК
2. Мне показалось, автор неявно имел ввиду следующую задачу: обеспечить уникальность номеров документов, созданных любым способом, среди нескольких баз.

Для решения этой задачи, нужно немного усложнить алгоритм уважаемого pail

РЕШЕНИЕ НЕСТРОГОЕ, будет работать с вероятностью 99%
100% решение невозможно, т.к. запись документа и проверка номера происходят в разных транзакциях!
Потребовались бы распределенные транзакции, которые 1С не поддерживает.

1. Создаем таблицу с первичным ключем по номеру или по периодичности и номеру, чтобы начинать нумерацию сначала каждый год.
2. Создаем триггеры AFTER INSERT, UPDATE, DELETE во всех нужных базах 1С, на таблицу _1SJOURN.
Триггеры изменяют общую таблицу в соответствии с изменениями своих таблиц.


Все "правильные" процедуры записи документа будут действовать по алгоритму

pailВ конфигурации 1С в форме документа в процедуре ПриЗаписи

если ПустаяСтрока(НомерДок)=1 тогда
НомерДок=ПрисвоитьУникальныйНомер(ИдентификаторДокумента(контекст));
иначеесли ПроверитьУникальностьНомера(НомерДок,ИдентификаторДокумента(контекст))=0 тогда
СтатусВозврата( 0 ); // номер уже занят, причем не этим документом
конецЕсли;

В неправильных процедурах, если получатся неуникальные номера, 1С свалится с невосстановимой ошибкой, как в 1-м посте.
Так их будет легко найти и, затем, переписать.
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / [игнор отключен] [закрыт для гостей] / V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]