惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Google DeepMind News
Google DeepMind News
I
InfoQ
Engineering at Meta
Engineering at Meta
D
DataBreaches.Net
L
LangChain Blog
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
Recent Announcements
Recent Announcements
GbyAI
GbyAI
爱范儿
爱范儿
Microsoft Security Blog
Microsoft Security Blog
腾讯CDC
美团技术团队
罗磊的独立博客
Microsoft Azure Blog
Microsoft Azure Blog
WordPress大学
WordPress大学
T
The Blog of Author Tim Ferriss
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
雷峰网
雷峰网
M
MIT News - Artificial intelligence
D
Docker
MongoDB | Blog
MongoDB | Blog
F
Fortinet All Blogs
博客园 - 叶小钗

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания
1С «В данной транзакции уже происходили ошибки» для собес...
mustafa222 · 2026-04-27 · via Все публикации подряд на Хабре

Всем привет!

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

P.S.: Здесь мы не будем разбирать другие вопросы, которые тоже очень часто любят спрашивать про транзакции - это ACID и уровни изоляции транзакций.

  1. Что такое транзакция в общем?

    Это принцип — выполнится «все или ничего». К примеру, в 1С это операции между конструкциями

    НачатьТранзакцию();
    //
    ЗафиксироватьТранзакцию();
  2. Явные / Неявные транзакции:

    Явные — через НачатьТранзакцию(), ЗафиксироватьТранзакцию()
    Неявные — к примеру, в модуле объекта справочника ПриЗаписи()

  3. Бывают ли вложенные транзакции?

    На уровне СУБД нет, на уровне кода 1С можно писать сколько угодно раз НачатьТранзакцию() (счетчик вложенности увеличивается) а потом столько же раз ЗафиксироватьТранзакцию() (счетчик вложенности уменьшается), НО на уровне СУБД при этом будет создана только одна транзакция и она будет завершена когда последняя ЗафиксироватьТранзакцию() (счетчик вложенности = 0) отработает.

  4. Что такое сломанная транзакция?

    Состояние, когда СУБД уже откатила транзакцию из‑за ошибки, но код приложения 1С продолжает выполняться, и любые дальнейшие обращения к БД приводят к ошибке «в данной транзакции уже происходили ошибки».

    Из кода 1С мы никак не можем понять что транзакция сломана, но есть костыль:

  5. Способы получения сломанной транзакции?

    Вариант 1: Ошибка при операции в базе данных

    Вариант 1: Ошибка при операции в базе данных

    ! Ошибка может быть и во вложенной неявной транзакции. К примеру, в модуле объекта справочника, который мы пытаемся записать в попытке.

    Вариант 2: через ОтменитьТранзакцию()

    Вариант 2: через ОтменитьТранзакцию()

    ! ОтменитьТранзакцию() это так же установка флага Отказ в Истина, допустим, при записи справочника.

  6. Когда мы НЕ получим сломанную транзакцию?

    Когда ошибка в Попытке/Исключении не будет связана с обращением к СУБД

  7. Стандарты разработки по написанию транзакций:

    НачатьТранзакцию();
    Попытка
         // блокировки, чтение, запись 
         // … 
         ЗафиксироватьТранзакцию();
    Исключение
         ОтменитьТранзакцию();
         ВызватьИсключение; // если есть внешняя транзакция
    КонецПопытки

    Полный код обработки:

Процедура СломаемТранзакциюВариант1()
  
  НачатьТранзакцию();
  
  Попытка
    Запрос = Новый Запрос;
    Запрос.Текст = "Выбрать 1/0";
    Запрос.Выполнить();
  Исключение
  КонецПопытки;
  
  Сообщить(ЭтаТранзакцияСломана()); //Да!
  
  ЗафиксироватьТранзакцию();
  
КонецПроцедуры

Процедура СломаемТранзакциюВариант2()
  
  НачатьТранзакцию();
  
  Попытка
    НачатьТранзакцию();
    ОтменитьТранзакцию();
  Исключение
  КонецПопытки;
  
  Сообщить(ЭтаТранзакцияСломана()); //Да!
  
  ЗафиксироватьТранзакцию();
  
КонецПроцедуры

Процедура НеСломаемТранзакцию()
  
  НачатьТранзакцию();
  
  Попытка
    а = Новый Структура;
    б = а.НовоеПоле;
  Исключение
  КонецПопытки;
  
  Сообщить(ЭтаТранзакцияСломана()); //Нет!
    
  ЗафиксироватьТранзакцию();
  
КонецПроцедуры


Функция ЭтаТранзакцияСломана()

  Попытка
    Запрос = Новый Запрос;
    Запрос.Текст = "Выбрать 1";
    Запрос.Выполнить();
    Возврат Ложь;
  Исключение
    Возврат Истина;
  КонецПопытки;
  
КонецФункции