|
|
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
Задача: 1. Присваивать уникальные номера документа, если номер не задан вручную. 2. Нужно при записи проверять уникальность доп. номера документа и возвращать сообщение об ошибке. Решение: Хочу сделать это через тригер и хранимую процедуру. С пунктом 1 проблем нет. Есть проблема с пунктом 2: Как отменить транзакцию и вернуть в 1С ошибку так, чтоб 1С при этом не валилась? RAISERROR ('Проба...',18,1) тупо валить 1С с невосстановимой ошибкой базы. ROLLBACK TRANSACTION та же ошибка. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2009, 12:06 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
vastok, а СтатусВозврата(0) в модуле проведения не оно ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 10.08.2009, 22:53 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
Last1Cmen, Не оно. Мне нужно получать некий результат при записи из SQL так, чтоб этот результат можно было обработать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2009, 10:21 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
vastok, ну если обработать надо Код: plaintext 1. 2. 3. 4. непонятно почему именно СКЛ должен это делать ? быстрее не будет всё равно ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2009, 11:29 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
а УстановитьНовыйНомер() чем не подходит? Или с нумератором что случилось? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2009, 11:30 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
Defender77, Есть Н баз. В базах есть Док, который гарантированно должен иметь уникальный номер. Все базы лежат на одном сервере. Есть отдельная база с таблицей вида "ИдДок|Номер" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2009, 11:48 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
vastok, ну так вставь в исключение поиск по тому номеру что хочешь присвоить и если он уже есть пиши в БД новый номер и его ищи пока не найдёшь не занятый после чего записывай и выходи из попытки зачем тут обработка срв-вами СКЛ ?! поиск по номеру быстрая вещь и в самой 1це ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2009, 13:36 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
Решение: 1. Отдельная (не-1С) база и таблица в ней, которая отвечает за уникальность номеров. Она хранит все выданные номера, умеет проверить, занят номер или нет, и умеет создать новый номер. Таблица хранит соответствия строк - некий идентификатор 1С-документа, уникальный в пределах группы баз. Будет это специально генерируемый guid, или комбинация ид.базы+номерДокумента+датаДокумента, опять же, особой роли не играет. Из 1С к ней можно обращаться через ADO (запросы, хранимые процедуры - дело вкуса) 2. В конфигурации 1С в форме документа в процедуре ПриЗаписи если ПустаяСтрока(НомерДок)=1 тогда НомерДок=ПрисвоитьУникальныйНомер(ИдентификаторДокумента(контекст)); иначеесли ПроверитьУникальностьНомера(НомерДок,ИдентификаторДокумента(контекст))=0 тогда СтатусВозврата(1); // номер уже занят, причем не этим документом конецЕсли; Функции, использованные в п.2 - реализация того, что описано в п.1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2009, 14:04 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
Last1Cmen, ПРОЧТИ ЕЩЕ РАЗ СООБЩЕНИЕ ВЫШЕ. Есть Н баз. Какие средствами 1С. Н баз! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2009, 14:41 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
pail, Только нужно заблокировать хранилище номеров до записи текущего документа... а после записи его разблокировать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2009, 14:46 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
vastokpail, Только нужно заблокировать хранилище номеров до записи текущего документа... а после записи его разблокировать. Вот пусть такими подробностями и занимается ПрисвоитьУникальныйНомер() Или та ХП, которая будет из нее вызываться. Блокировать же достаточно именно на время выделения номера. А запись в каждую отдельную базу 1С пусть независимо идет. Если есть сомнения в том, что транзакция записи завершится успешно, поставить приведенный код последним в событии ПриЗаписи. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2009, 14:52 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
vastok, ставить задачу конкретно надо мол есть база не 1с с номерами док-тов которая пишет в таблицы баз 1с документы присваивая им номер из своих таблиц/таблицы... а то у тебя получается есть куча баз 1с и некая таблица в которой хранятся данные о номерах и запись док-та происходит в самой 1с с поиском номера в этой таблице опять же с новой постановкой задачи не понимаю в чем проблема проверить уникальность номера в каждой из БД... само собой Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2009, 15:17 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
Last1Cmen, И во время проверки на уникальность исправленного номера вручную. Вот проблема заблокировать таблицу и вернуть сообщение результат, если номер не уникальный. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2009, 16:58 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
pail, Сомнения в том, - что пройдет проверка - из другой базы добавят номер - запишится документ Запишится докумен и получим задвоение. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2009, 17:00 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
vastokpail, Сомнения в том, - что пройдет проверка - из другой базы добавят номер - запишится документ Запишится докумен и получим задвоение. 1. Проверяем, что номер еще не присвоен 2. Выделяем номер - процедура, исполняемая на сервере SQL. Со всеми необходимыми блокировками. С ожиданием в этой же процедуре, если блокировка уже выставлена другим клиентом. 3. Присваиваем номер документу. Если в это же время будет запрос на новый номер от другой базы - он будет создан действительно новым (см. п.2). Если же в другой базе будет попытка записать созданный вручную номер, совпадающий с только что созданным автоматически - функция ПроверитьУникальностьНомера() должна будет сообщить о неудаче. А что при этом делать пользователю - вы уж придумайте что-нибудь самостоятельно. Естественно, ПроверитьУникальностьНомера() должна учитывать вероятность попадания на момент создания нового номера. Проверив существование той же блокировки, например. Я ведь примерный алгоритм предложил, как иллюстрацию принципа. Детали реализации - для Вас. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2009, 17:16 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
vastok, запишется ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.08.2009, 23:31 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
pailРешение: 1. Отдельная (не-1С) база и таблица в ней, которая отвечает за уникальность номеров. Она хранит все выданные номера, умеет проверить, занят номер или нет, и умеет создать новый номер. Таблица хранит соответствия строк - некий идентификатор 1С-документа, уникальный в пределах группы баз. Будет это специально генерируемый guid, или комбинация ид.базы+номерДокумента+датаДокумента, опять же, особой роли не играет. Из 1С к ней можно обращаться через ADO (запросы, хранимые процедуры - дело вкуса) 2. В конфигурации 1С в форме документа в процедуре ПриЗаписи если ПустаяСтрока(НомерДок)=1 тогда НомерДок=ПрисвоитьУникальныйНомер(ИдентификаторДокумента(контекст)); иначеесли ПроверитьУникальностьНомера(НомерДок,ИдентификаторДокумента(контекст))=0 тогда СтатусВозврата(1); // номер уже занят, причем не этим документом конецЕсли; Функции, использованные в п.2 - реализация того, что описано в п.1 Что будет, при программном создании документа обработкой? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2009, 10:33 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
HoBTID Что будет, при программном создании документа обработкой? Ничего не будет - если не сделать то же самое и в обработке. Такова семерка. Однако: 1. в описании задачи шла речь о ручном присвоении номеров - т.е. через форму, а не программным созданием документа. 2. Обработки программного создания документов сами собой не создаются, и в обычных конфигурациях, как правило, не встречаются. Нет проблем с тем, чтобы, создав и эксплуатируя такую обработку, учесть в ней и такой момент, как особенности назначения номеров для отдельно взятого вида документа. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2009, 11:20 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
А как предполагается решить следующую проблему: В 1с форма документа открывается и в ней уже есть номер. Документ может иметь какие-то печатные формы. А в конце разного рода манипуляций документ не сохраняется. В этот момент другая программа запросила и получила следующий номер. В нумерации появилась дырка. Это допустимо? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2009, 12:45 |
|
||
|
V7: SQL. Как отменить транзакцию и вернуть в 1С ошибку так, чтоб не завалить 1С?
|
|||
|---|---|---|---|
|
#18+
pailHoBTID Что будет, при программном создании документа обработкой? Ничего не будет - если не сделать то же самое и в обработке. Такова семерка. Однако: 1. в описании задачи шла речь о ручном присвоении номеров - т.е. через форму, а не программным созданием документа. 2. Обработки программного создания документов сами собой не создаются, и в обычных конфигурациях, как правило, не встречаются. Нет проблем с тем, чтобы, создав и эксплуатируя такую обработку, учесть в ней и такой момент, как особенности назначения номеров для отдельно взятого вида документа. 1. Через форму - тогда ОК 2. Мне показалось, автор неявно имел ввиду следующую задачу: обеспечить уникальность номеров документов, созданных любым способом, среди нескольких баз. Для решения этой задачи, нужно немного усложнить алгоритм уважаемого pail РЕШЕНИЕ НЕСТРОГОЕ, будет работать с вероятностью 99% 100% решение невозможно, т.к. запись документа и проверка номера происходят в разных транзакциях! Потребовались бы распределенные транзакции, которые 1С не поддерживает. 1. Создаем таблицу с первичным ключем по номеру или по периодичности и номеру, чтобы начинать нумерацию сначала каждый год. 2. Создаем триггеры AFTER INSERT, UPDATE, DELETE во всех нужных базах 1С, на таблицу _1SJOURN. Триггеры изменяют общую таблицу в соответствии с изменениями своих таблиц. Все "правильные" процедуры записи документа будут действовать по алгоритму pailВ конфигурации 1С в форме документа в процедуре ПриЗаписи если ПустаяСтрока(НомерДок)=1 тогда НомерДок=ПрисвоитьУникальныйНомер(ИдентификаторДокумента(контекст)); иначеесли ПроверитьУникальностьНомера(НомерДок,ИдентификаторДокумента(контекст))=0 тогда СтатусВозврата( 0 ); // номер уже занят, причем не этим документом конецЕсли; В неправильных процедурах, если получатся неуникальные номера, 1С свалится с невосстановимой ошибкой, как в 1-м посте. Так их будет легко найти и, затем, переписать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 12.08.2009, 14:02 |
|
||
|
|

start [/forum/topic.php?fid=28&msg=36136577&tid=1523458]: |
0ms |
get settings: |
8ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
188ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
78ms |
get tp. blocked users: |
2ms |
| others: | 241ms |
| total: | 560ms |

| 0 / 0 |
